设计模式之策略模式

lz 1年前 ⋅ 1141 阅读

策略:干某件事情的时候可以选择不同种方式进行,每种方式都是独立的,但是各种方式都有某个共同点。如:我们每天上班可以选择不同种去公司的办法,1.公交车,2 地铁,3,班车 4,自己开车,5,自行车,6.步行等等,这里的方式对应着干这件事情不同的办法。

策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

组成:

—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

—具体策略角色:包装了相关的算法和行为。

—环境角色:持有一个策略类的引用,最终给客户端调用。

案例:

/**
 * 首先定一个策略接口,各种办法的接口
 */
public interface IStrategy {
    /**
     * 是一个可执行的算法
     */
    public void operate();
 
}

策略的实现:

public class Aircraft  implements IStrategy {
    public void operate() {
        System.out.println("老王坐飞机去东北");
    }
}
 
public class Bicycle implements IStrategy {
    public void operate() {
        System.out.println("老王骑自行车去东北");
    }
}
 
public class Car   implements IStrategy {
    public void operate() {
        System.out.println("老王开车去东北");
    }
}

容器:调用策略  封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

/**
 *
 */
public class Context {
    //构造函数,你要使用那个策略
    private IStrategy straegy;
 
    public Context(IStrategy strategy) {
        this.straegy = strategy;
    }
 
    //使用算法
    public void operate() {
        this.straegy.operate();
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        Context context;
        System.out.println("-----------老王准备出发了先准备自驾车去东北-------------");
        context = new Context(new Car()); //选择自驾车
        context.operate(); //自驾车
        System.out.println("\n\n\n\n\n\n\n\n");
        System.out.println("-----------老王中途准备换成先准备骑自行车-------------");
        context = new Context(new Bicycle());//自行车
        context.operate(); //骑着自行车
        System.out.println("\n\n\n\n\n\n\n\n");
 
        System.out.println("-----------老王嫌太累准备换成飞机-------------");
         context = new Context(new Aircraft());
        context.operate(); //坐上飞机
        System.out.println("\n\n\n\n\n\n\n\n");
         /*
         * 策略模式的好处就是:体现了高内聚低耦合的特性
         */
    }
}

 

--end--

 

版权 本着开源共享、共同学习的精神,本文转载自 https://zhanghongwei.blog.csdn.net/article/details/107334606 , 如果侵权之处,请联系博主进行删除,谢谢~