设计模式——行为型

1.观察者模式

应用:多个对象依赖于一个对象时,能有效保证解耦;

特点:建立一种一对多的关系,一个对象发生变化其余对象都能知道并更新(JDK内置);

角色:Observable------抽象主题,被观察角色(JDK内置)

ConcreteObservable------具体主题,具体被观察角色,存入具体观察者,当发生变化时通知各观察者

Observer------抽象观察者(JDK内置,内置为接口);

ConcreteObservable------具体观察者;

java 复制代码
java版本:
//具体观察者
public class ConcreteObserver implements Observer {
    public String mName;
    public ConcreteObserver (String name) {
        mName = name;
    }
    @Override
    public void update(Observable o,Object arg) {
        Syetem.out.println("Hi,"+ mName +",更新了,内容:"+ arg);
    }
}
//具体主题
public class RealSubject extends Observable {
    public void postNewContent(String content) {
        setChanget();//内置函数,表明标识或状态发送变化;
        notifyObservers(content);//内置函数将新内容通知给所有观察者,content与update方法中的Object arg参数对应
    }
} 
//测试
public class Test {
    public static void main(String[] args) {
        ConcreteObserver concreteObserver1 = new ConcreteObserver ("A");
        ConcreteObserver concreteObserver2 = new ConcreteObserver ("B");
        ConcreteObserver concreteObserver3 = new ConcreteObserver ("C");
        RealSubject realSubject = new RealSubject();
        realSubject.addObserver(concreteObserver1 );//内置方法 
        realSubject.addObserver(concreteObserver2 );
        realSubject.addObserver(concreteObserver3 );
        realSubject.postNewContent("元宇宙新技术面世"); 
}
kotlin 复制代码
kotlin版本:
class Test(var listener:(value:Int) -> Unit) {
	listener.invoke(value)
	var callBack : (result: String) -> Unit = {
    }
}
val test = Test {
	//对value进行处理
	callBack = {
		//对result值处理
	}
}

2.状态机模式

State------状态下的行为,抽象或者接口类。

ConcreteState------具体状态下的具体行为。

Context------外部感兴趣的接口,维护一个State的实例,该实例定义了对象当前的状态。

java 复制代码
public interface TvState{
    public void nextChannel();
    public void prevChannel();
    public void turnUp();
    public void turnDown();
}
public class PowerOnState implements TvState{
	@Override
	public void nextChannel(){
	    print("下一个频道");
	}
	@Override
    public void prevChannel(){
        print("上一个频道");
    }
    @Override
    public void turnUp(){
        print("调大音量");
    }
    @Override
    public void turnDown(){
        print("调小音量");
    }
} 
public class PowerOffState implements TvState{
	@Override
	public void nextChannel(){
	}
	@Override
    public void prevChannel(){
    }
    @Override
    public void turnUp(){
    }
    @Override
    public void turnDown(){
    }
} 
public interface PowerController{
    public void powerOn();
    public void powerOff();
}
public class TvController implements PowerController{
    private TvState tvState;
    private setTvState(TvState tvState){
        this.tvState = tvState;
    }
    @Override
    public void powerOn(){
        setTvState(PowerOnState);
    }
    @Override
    public void powerOff(){
        setTvState(PowerOffState);
    }
	public void nextChannel(){
	    tvState.nextChannel();
	}
    public void prevChannel(){
        tvState.prevChannel();
    }
    public void turnUp(){
        tvState.turnUp();
    }
    public void turnDown(){
        tvState.turnDown();
    }
}
TvController tvController = new TvController();
tvController.powerOn();//开机
tvController.nextChannel();//下一个频道
tvController.turnUp();//调大音量
tvController.powerOff();//关机
tvController.prevChannel();//上一个频道无效,关机后所有操作无效
相关推荐
光军oi39 分钟前
全栈开发杂谈————关于websocket若干问题的大讨论
java·websocket·apache
weixin_419658311 小时前
Spring 的统一功能
java·后端·spring
小许学java1 小时前
Spring AI-流式编程
java·后端·spring·sse·spring ai
haogexiaole2 小时前
Java高并发常见架构、处理方式、api调优
java·开发语言·架构
@大迁世界2 小时前
Vue 设计模式 实战指南
前端·javascript·vue.js·设计模式·ecmascript
EnCi Zheng2 小时前
@ResponseStatus 注解详解
java·spring boot·后端
wdfk_prog2 小时前
闹钟定时器(Alarm Timer)初始化:构建可挂起的定时器基础框架
java·linux·数据库
怎么没有名字注册了啊3 小时前
C++后台进程
java·c++·算法
z日火3 小时前
Java 泛型
java·开发语言
简色3 小时前
题库批量(文件)导入的全链路优化实践
java·数据库·mysql·mybatis·java-rabbitmq