• 策略模式


    一、应用背景

    在软件开发中常遇到这种情况,实现某一个功能有多重算法或者策略,我们可以根据不同的场景选择不同的算法或者策略来完成该功能,把一个类(A)中经常改变或者将来可能改变的部分提取出来,作为一个接口B,然后在类A中包含这个接口B,这样类A的实例在运行时就可以随意调用实现了这个接口的类C的行为,比如定义一系列的算法,把每一个算法封装起来,并且把它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。

    二、优缺点

    优点:

     可以动态的改变对象的行为

    缺点:

     客户端必须知道所有的策略类,并自行决定使用哪一个策略类

     策略模式将产生很多的策略类

    三、组成

    1、运行环境类: strategy

       这个策略模式运行的环境,其实也就是在哪里使用

    2、应用场景类:Person

      这个就是客户端访问的类,也就是该类的对象所持有的策略

    3、具体策略类:Car

    具体实现策略类

    4、抽象策略类:AbstractCarFunction

    根据不同的需求,产生不同的策略或算法的接口

    四、代码实现

    1、抽象策略类:CarFunction

    public interface CarFunction {
    	
    	void run();
    }
    

    2、具体策略父类:Car

    public class Car implements CarFunction {
    	
    	protected String name;
    	protected String color;
    	
    	public Car(String name, String color) {
    		this.name = name;
    		this.color = color;
    	}
    
    	@Override
    	public void run() {
    		System.out.println(color +" " + name  +"在行驶。。。");
    	}
    
    }
    

     3、具体策略实现子类:BussCar SmallCar

    public class BussCar extends Car {
    
    	public BussCar(String name, String color) {
    		super(name, color);
    	}
    
    	public void run() {
    		System.out.println(color +" " + name  +"在缓慢的行驶。。。");
    	}
    }
    
    public class SmallCar extends Car{
    
    	//具体策略实现子类
    	public SmallCar(String name, String color) {
    		super(name, color);
    	}
    	
    	public void run() {
    		System.out.println(color +" " + name  +"在高速的行驶。。。");
    	}
    }
    

     4、应用场景类

    public class Person {
    	
    	private String name;
    	private int age;
    	
    	public Person(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	
    	//驾驶技能 需要一辆车
    	public void driver(Car car) {
    		System.out.print(name +"  "+ age+" 岁 "+" 开着");
    		car.run();
    	}
    
    }
    

     5、运行环境类:Strategy

    public class Strategy {
    
    	public static void main(String[] args) {
    
    		Car smallCar = new SmallCar("法拉利", "黑色");
    		Car bussCar = new BussCar("路虎","红色");
    		
    		Person person = new Person("小王	", 30);
    		
    		person.driver(smallCar);
    		person.driver(bussCar);
    			
    	}
    
    }
    

     五、总结

    策略模式就是老司机会驾驶,今天开路虎,明天开法拉利,针对不同的需求,来使用不同的应对策略,好记一点就是:老司机开车,或者商场不同的产品搞促销等等场景

  • 相关阅读:
    BZOJ 1029 & 丝帛贪心
    BZOJ 1831 & 就是一个DP....
    HDU2138 & 米勒拉宾模板
    BZOJ 2733 & splay的合并
    hdu Matrix Multiplication 写一个类似哈希函数的东西一切就解决了。
    hdu Cow Sorting 数学题(值得思考)
    Find them, Catch them 并查集
    Buy Tickets 简单的线段树&&反向更新
    Who Gets the Most Candies? 线段树的建立更新和反素数
    Apple Tree 有时间戳的树状数组
  • 原文地址:https://www.cnblogs.com/cherish010/p/9759035.html
Copyright © 2020-2023  润新知