什么是状态模式

        定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

什么是策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。

本人看法

        同样的都是拥有父级接口,策略模式:策略接口,状态模式:状态接口,他们都有不同的实现类去处理不同状态或是不同策略对应的方法。他们的环境对象中策略模式需要有策略对象,状态模式中需要有状态对象。在我看来完全都是同样的形式。

不同点:是在修改环境中定义属性方式不同。策略模式:利用构造方法创建策略的不同实现。每个策略都可以自由切换的。状态模式:利用set方法修改不同的状态。每个状态是相互独立的不能自由切换,一般会封装状态的转换规则。

策略模式实现:

/**
 * 策略抽象接口
 * Created by hang on 2018/3/22.
 */
public interface Strategy {
    //子类需要实现的方法
    void algorithm();
}
/**
 * 实现策略1:
 * Created by hang on 2018/3/22.
 */
public class MergeSortStrategy implements Strategy{

    public void algorithm() {
        System.out.println("------这里实现了归并排序------");
        
    }

}
/**
 * 策略实现2
 * Created by hang on 2018/3/22.
 */
public class QuickStrategy implements Strategy{
    
    public void algorithm() {
        System.out.println("-------实现了快速排序算法------");
    }
}
/**
 * 策略模式环境对象
 * Created by hang on 2018/3/22.
 */
public class Context {
    //定义策略属性
    private Strategy strategy;
    //利用构造方法创建不同的实现
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    //调用当前策略属性的方法
    public void algorithm(){
        this.strategy.algorithm();
    }
}

优点:


        结构清晰明了、使用简单直观


        耦合度相对而言较低,扩展方便


        操作封装也更为彻底,数据更为安全


缺点:


        随着策略的增加,子类也会变得繁多



状态模式 :

/**
 * 状态抽象接口
 * Created by hang on 2018/3/22.
 */
public interface State {
    void open();
    void close();
}
/**
 * 运行状态
 * Created by hang on 2018/3/22.
 */
public class Run implements State{
    public void open() {
        System.out.println("————电梯运行中不能开门————");
    }

    public void close() {
        System.out.println("————电梯运行中门已关闭————");
    }
}
/**
 * 停止状态
 * Created by hang on 2018/3/22.
 */
public class Stop implements State{
    public void open() {
        System.out.println("————电梯门已打开————");
    }

    public void close() {
        System.out.println("————电梯门已关闭————");
    }
}

优点:

很好地体现了开闭原则和单一职责原则,每个状态都是一个子类,要增加状态就增加子类,需要修改状态,修改对应的子类即可。

状态变换放置到类的内部实现,外部的调用不用知道类内部是如何实现状态和行为的变换。

为的变换。避免了过多的switch...case或if...else语句的使用,避免了程序的复杂性,提高了系统的可维护性。

缺点:

缺点就是抽象状态的子类会太多,导致类膨胀。如果一个事物有多个状态也很正常,如果完全使用状态模式会有太多的子类,不便于管理。