设计模式——行为型

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();//上一个频道无效,关机后所有操作无效
相关推荐
皮皮林5516 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河6 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程9 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅11 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟12 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder12 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者12 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺12 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart13 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot