观察者模式与建造者模式

观察者模式

定义

  • 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  • ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
  • ConcrereObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

实例:图书订阅

  • 定义抽象观察者ObserVer
public interface IObserver {

    //更新的方法,图书更新通知订阅者
    void update(String message);
}
  • 创建观察者读者
/**
 * 创建观察者北京的读者,实现更新方法
 * Created by shiqiang on 2017/3/15.
 */

public class BookUserBeijing implements IObserver{

   private String name;

    public BookUser(String name ) {
        this.name = name ;
    }

    @Override
    public void update(String message) {

        System.out.println("读者:" + name + ",接收到了图书更新:" + message);

    }
}

/**
 * 天津的读者订阅
 * Created by shiqiang on 2017/3/15.
 */

public class BookUserTianjin implements IObserver {


    private String name ;
    public BookUserTianjin(String name) {
        this.name = name ;
    }

    @Override
    public void update(String message) {

        System.out.println("读者:" + name + ",接收到了图书更新:" + message);

    }
}

  • 创建被观察者接口,用于订阅,接触订阅,发布消息更新
public interface Subject {


    /**
     * 增加订阅者
     */

    void attach(IObserver observer);

    /**
     * 移除订阅者
     */
    void detach(IObserver observer);


    /**
     * 通知订阅者更新消息
     */

    void notice(String message);

}

  • 具体被观察者
/**
 * 用于用户的订阅,发布更新等
 * Created by shiqiang on 2017/3/15.
 */

public class SubscriptionSubject implements Subject {


    //存储用户信息的集合
    private List<IObserver> list = new ArrayList<>();



    @Override
    public void attach(IObserver observer) {

        list.add(observer);
    }

    @Override
    public void detach(IObserver observer) {
        list.remove(observer);

    }

    @Override
    public void notice(String message) {

        for(IObserver observer : list){

            observer.update(message);
        }
    }
}
  • 测试功能
  SubscriptionSubject sub = new SubscriptionSubject();

        BookUserBeijing beijing1 = new BookUserBeijing("貂蝉");
        BookUserBeijing beijing2 = new BookUserBeijing("吕布");
        BookUserTianjin tianjin = new BookUserTianjin("董卓");

        sub.attach(beijing1);
        sub.attach(beijing2);
        sub.attach(tianjin);

        sub.notice("我们分布了所有人的版本");

        //将天津的用户移除,只对北京用户发布
        sub.detach(tianjin);

        sub.notice("咱两玩儿,不带他~哈哈");


System.out: 读者:貂蝉,接收到了图书更新:我们分布了所有人的版本
System.out: 读者:吕布,接收到了图书更新:我们分布了所有人的版本
System.out: 读者:董卓,接收到了图书更新:我们分布了所有人的版本
System.out: 读者:貂蝉,接收到了图书更新:咱两玩儿,不带他~哈哈
System.out: 读者:吕布,接收到了图书更新:咱两玩儿,不带他~哈哈

建造者模式

定义

  • 建造者模式(builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。

实例:组装一台电脑

  • 创建电脑的javabean,需要cpu ,主板,内存卡

public class Computer {

    private String mCpu;
    private String mMainboard;
    private String mRam;

    public String getmCpu() {
        return mCpu;
    }

    public void setmCpu(String mCpu) {
        this.mCpu = mCpu;
    }

    public String getmMainboard() {
        return mMainboard;
    }

    public void setmMainboard(String mMainboard) {
        this.mMainboard = mMainboard;
    }

    public String getmRam() {
        return mRam;
    }

    public void setmRam(String mRam) {
        this.mRam = mRam;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "mCpu='" + mCpu + '\'' +
                ", mMainboard='" + mMainboard + '\'' +
                ", mRam='" + mRam + '\'' +
                '}';
    }
}
  • 创建Builder类规范产品的组建,是一个接口或者抽象类,定义规范用的
public abstract class Builder {

    //建造cpu,主板,跟内存
    public abstract void buildCpu(String cpu);
    public abstract void buildMainboard(String mainboard);
    public abstract void buildRam(String ram);

    //创建电脑
    public abstract Computer create();

}
  • 创建Bulid的实现类,具体功能是构建电脑
public class ComputerBuilder extends Builder {


    private Computer com = new Computer();


    @Override
    public void buildCpu(String cpu) {

        com.setmCpu(cpu);
    }

    @Override
    public void buildMainboard(String mainboard) {

        com.setmMainboard(mainboard);
    }

    @Override
    public void buildRam(String ram) {

        com.setmRam(ram);
    }

    @Override
    public Computer create() {

        return com;
    }
}
  • 用Dirextor指挥者类来统一组装过程
    商家的指挥者类用来规范组装电脑的流程规范,先安装主板,再安装CPU,最后安装内存并组装成电脑:
public class Direcror {


    private Builder builder;
    public Direcror(Builder builder) {
        this.builder = builder;
    }

    public Computer createComputer(String cpu , String main , String ram){

        builder.buildCpu(cpu);
        builder.buildMainboard(main);
        builder.buildRam(ram);

        return builder.create() ;
    }

}
  • 调用程序组装
 //创建构建者
        Builder builder = new ComputerBuilder();
        Direcror direcror = new Direcror(builder);

        //组装
        Computer computer = direcror.createComputer("小米", "Inter", "闪迪");

        System.out.println(computer.toString());

//打印结果
System.out: Computer{mCpu='小米', mMainboard='Inter', mRam='闪迪'}

构建者模式第二类(javaBean)

  1. 定义一个静态内部类Builder,内部成员变量跟外部一样

  2. Builder通过一系列方法给成员变量赋值,并返回当前对象(this)

  3. Builder类内部提供一个build方法方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有化构造方法,该构造方法的参数就是内部类Builder

  4. 外部类提供一个私有化的构造方法供内部类调用,在该构造函数中完成成员变量的赋值

    • 具体示例(登出的时候讲SP中的值置为初始值null)

      1. 创建javaBean类

        public class OutLogin {
        
        private boolean loginState ;
        private String userId ;
        private String userName ;
        private String storeName ;
        private String pis ;
        
        }
      2. 在里面定义一个内部类

        public static class Build{
            private boolean loginState ;
            private String userId ;
            private String userName ;
            private String storeName ;
            private String pis ;
        
        
            public Build loginState(boolean loginState){
                this.loginState = loginState ;
                return this ;
        
            }
        
            public Build userId(String userId){
                this.userId = userId;
                return this ;
            }
        
        
            public Build userName(String userName){
                this.userName = userName;
                return this ;
            }
        
        
            public Build storeName(String storeName){
                this.storeName = storeName;
                return this ;
            }
        
        
            public Build pis(String pis){
                this.pis = pis;
                return this ;
            }
        
        
            public OutLogin build(){
        
                return new OutLogin(this);
            }
        
      3. 在外部类中创建一个私有的引用

         private OutLogin(Build build) {
        this.loginState = build.loginState;
        this.userId = build.userId;
        this.userName = build.userName;
        this.storeName = build.storeName;
        this.pis = build.pis;
        }
      4. 在类中设置一个方法操作数据
        “`

        public void setSp(){

      SpUtils.setBoolean(App.getApplication(), “loginState”, loginState);
      SpUtils.setString(App.getApplication(), “userId”, userId);
      SpUtils.setString(App.getApplication(), “userName”, userName);
      SpUtils.setString(App.getApplication(), “storeName”, storeName);
      SpUtils.setString(App.getApplication(), “pis”, pis);

    }

    5. 外部调用的代码

            OutLogin outLogin = new OutLogin.Build()
                    .loginState(false)
                    .userId("")
                    .userName("")
                    .storeName("")
                    .pis("")
                    .build();
            outLogin.setSp();
    
    
            ```
    

猜你喜欢

转载自blog.csdn.net/wei_ai_n/article/details/62228642
今日推荐