# 设计模式

Posted MarlonBrando1998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# 设计模式相关的知识,希望对你有一定的参考价值。


  • 图来自百度:
    在这里插入图片描述
单例模式
工厂模式
代理模式
适配器模式

观察者模式

简单理解
  • 观察者模式是一种行为性模式,定义对象之间的一对多的依赖关系,当一个对象状态改变时候依赖于它的对象的状态会相应的更新。
使用场景
  • 关联行为场景,关联行为是可拆分的,事件多级触发。
  • 消息队列、时间总线处理机制。
实例代码
  • 接口定义观察者共同的方法

    public interface Observer {
    
        void update(int state);
    }
    
  • 定义具体的观察者

public class ObserverImpl implements Observer {

    private static final Logger logger = LoggerFactory.getLogger(ObserverImpl.class);

    // 具体观察者的属性
    private int myState;

    @Override
    public void update(int state) {
        myState = state;
        logger.info("收到消息,myState:{}", myState);
    }

    public int getMyState() {
        return myState;
    }
}
  • 定义主题
public class Subject {

    private static final Logger logger = LoggerFactory.getLogger(Subject.class);

    // 定义观察者的集合 使用vector 线程安全
    private Vector<Observer> list = new Vector<>();

    /**
     * 注册观察者
     *
     * @param observer
     */
    public void registerObserver(Observer observer) {
        list.add(observer);
    }

    /**
     * 删除观察者方法
     *
     * @param observer
     */
    public void removeObserver(Observer observer) {
        list.remove(observer);
    }

    /**
     * 通知所有的观察者更新
     *
     * @param state
     */
    public void notifyAllObserver(int state) {
        for (Observer observer : list) {
            observer.update(state);
        }
    }
}
  • 定义继承主题的具体观察者
public class RealObserver extends Subject {

    // 被观察对象的属性
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        //主题对象值发生改变
        this.notifyAllObserver(state);
    }
}
  • 测试代码
public class ObserverTest {

    private static final Logger logger = LoggerFactory.getLogger(ObserverTest.class);

    @Test
    public void test() {
        // 目标对象
        RealObserver realObserver = new RealObserver();

        // 创建多个观察者
        ObserverImpl observerOne = new ObserverImpl();
        ObserverImpl observerTwo = new ObserverImpl();
        ObserverImpl observerThree = new ObserverImpl();

        // 注册到观察者 vector中
        realObserver.registerObserver(observerOne);
        realObserver.registerObserver(observerTwo);
        realObserver.registerObserver(observerThree);

        // 改变目标对象的状态
        realObserver.setState(200);
        logger.info("observerOne 的state:{}", observerOne.getMyState());
        logger.info("observerTwo 的state:{}", observerTwo.getMyState());
        logger.info("observerThree 的state:{}", observerThree.getMyState());
    }
}

策略模式

简单理解
  • 在接口中定义方法,不同的实现类在重写的方法中做出不同的操作。
使用场景
  • 当符合场景时候可以替换if、else
实例代码
public interface CaculateData {
	// 计算
    int caculate(int num1,int num2);
}

public class CaculateAdd implements CaculateData {

    @Override
    public int caculate(int num1, int num2) {
        return num1 + num2;
    }

}

public class CaculateSub implements CaculateData {

    @Override
    public int caculate(int num1, int num2) {
        return num1 - num2;
    }

}

模板方法模式

简单理解
  • 使用继承关系:父类中定义相关的一系列行为,不同的子类通过继承抽象父类,在重写的方法中,不同的子类实现不同的业务逻辑。
实例代码
  • 抽象父类
public abstract class AbstractCookMeal {

    // 去市场
    abstract void moveToMarket();

    // 购买蔬菜
    abstract void buyVegetables();

    // 回家
    abstract void goHome();

    // 做饭
    abstract void cookMeal();


    public void doCooking(){
        moveToMarket();
        buyVegetables();
        goHome();
        cookMeal();
    }
    
}
  • 子类
public class PeopOneCookMeal extends AbstractCookMeal {

    private static final Logger logger = LoggerFactory.getLogger(PeopOneCookMeal.class);

    private String name;

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

    @Override
    void moveToMarket() {
        logger.info(this.name + "去超市!");
    }

    @Override
    void buyVegetables() {
        logger.info(this.name + "买蔬菜!");
    }

    @Override
    void goHome() {
        logger.info(this.name + "回家!");
    }

    @Override
    void cookMeal() {
        logger.info(this.name + "做饭!");
    }
}
  • 测试
/**
  * 模板模式
  * <p>
  * 使用继承关系:父类中定义相关的一系列行为,不同的子类通过继承抽象父类实现不同的行为
  */
@Test
public void test() {
    PeopOneCookMeal oneCookMeal = new PeopOneCookMeal("张三");
    oneCookMeal.doCooking();
}

以上是关于# 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

十条实用的jQuery代码片段

尝试使用片段保存夜间模式状态

如何更改谷歌地图标记上方的标题和片段设计

炫酷 CSS 背景效果的 10 个代码片段

添加片段时的 FlyOut 菜单设计问题

高效Web开发的10个jQuery代码片段