策略模式

策略模式的定义

策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式

策略模式的英文原话是:Define a family of algorithms, encapsulate each one, and make them interchangeable.

意思是:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。

策略模式的通用类图如图5-9所示。

策略模式涉及以下3个角色。

■ 环境(Context)角色:该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用

■ 抽象策略(Strategy)角色:该角色对策略、算法进行抽象,通常定义每个策略或算法必须具有的方法和属性。

■ 具体策略(Concrete Strategy)角色:该角色实现抽象策略中的具体操作,含有具体的算法。

 

 将需要变化的那部分功能拿出来,

public interface RunBehavior {  跑抽象出一个接口
    void run();
}
public class RunNormally implements RunBehavior{ 正常跑
    @Override
    public void run() {
        System.out.println("harding running...");
    }
}
public class RunNoWay implements RunBehavior{ 不跑
    @Override
    public void run() {    
    }
}

public interface SayHiBehavior { 说 抽象出一个接口
    void sayHi();
}
public class SayHiNormally implements SayHiBehavior{ 正常说
    @Override
    public void sayHi() {
        System.out.println("gegege");
    }
}
public class SayHiScream implements SayHiBehavior{ 尖叫说
    @Override
    public void sayHi() {
        System.out.println("gagagagaga....");
    }
}

public abstract class Chicken {
    private SayHiBehavior sayHiBehavior;
    private RunBehavior runBehavior;
    
    public void setSayHiBehavior (SayHiBehavior sayHiBehavior) {
        this.sayHiBehavior=sayHiBehavior;
    }
    
    public void setRunBehavior(RunBehavior runBehavior){
        this.runBehavior=runBehavior;
    }
    
    public void performSayHi(){
        this.sayHiBehavior.sayHi();
    }
    
    public void performRun(){
        this.runBehavior.run();
    }
    
    public abstract void show();
}

public class WhiteChicken extends Chicken{
    @Override
    public void show() {
        System.out.println("white...");
    }
}

public class MyTest {
    public static void main(String[] args) {
        WhiteChicken whiteChicken=new WhiteChicken();
        whiteChicken.setRunBehavior(new RunNormally());
        whiteChicken.setSayHiBehavior(new SayHiNormally());
        
        whiteChicken.performSayHi();
        whiteChicken.performRun();
        whiteChicken.show();
    }
}

参考:

https://blog.csdn.net/zhangliangzi/article/details/52161211

https://blog.csdn.net/fiendvip/article/details/51113967

posted @ 2020-06-07 20:32  弱水三千12138  阅读(159)  评论(0)    收藏  举报