码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式-策略模式

时间:2018-09-09 14:53:25      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:接口   方法   实例   引用   可变   抽象类   动态   好的   测试   

1、定义

  将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现并使他们可以互相替换,从而导致客户端程序独立于算法的改变

2、组合与策略模式

  继承是重用代码的利器,但继承并不总是最好的方式,还有组合方式:在类中增加一个私有域引用另一个已有的类的实例,通过调用引用实例的方法从而获得新的功能,这种设计被称作组合(复合)

定义策略接口-FlyStragety

public interface FlyStragety {
    
    void performFly();//飞行能力
}

策略接口实现1-FlyNoWay

public class FlyNoWay implements FlyStragety {

    public void performFly() {
        System.out.println("我不会飞啊");
    }
}

策略接口实现2-FlyWithWin

public class FlyWithWin implements FlyStragety {

    public void performFly() {
        System.out.println("我会飞行");
    }
}

定义抽象类

public abstract class Duck {

    private FlyStragety flyStragety;//面向接口编程

    public Duck(FlyStragety flyStragety) {
        this.flyStragety = flyStragety;
    }

    public void quack(){//鸣叫
        System.out.println("嘎嘎嘎...");
    }

    abstract void display();//外观

    /**
     * 提供公有的方法,面向接口编程使用动态绑定特性执行具体实现
     */
    public void fly(){
        flyStragety.performFly();
    }
}

定义Duck的子类1-RedDuck

public class RedDuck extends Duck {

    public RedDuck(FlyStragety flyStragety) {
        super(flyStragety);
    }

    @Override
    void display() {
        System.out.println("我是红脖子鸭子");
    }
}

定义Duck的子类2-RubberDuck

public class RubberDuck extends Duck {

    public RubberDuck(FlyStragety flyStragety) {
        super(flyStragety);
    }

    @Override
    void display() {
        System.out.println("全身发黄,嘴巴很红");
    }

}

说明:

  • quack方法已在抽象的父类中实现,子类不会强制覆盖,不覆盖则直接使用父类的方法。
  • display方法在抽象的父类中申明为抽象方法,子类必须覆盖。
  • fly方法在抽象的父类中为公共方法,通过组合方式,采用面向接口编程,基于动态特性调用实现类的具体方法。

测试方法:

public class DuckTest {

    @Test
    public void testDuck(){
        Duck duck=new RedDuck(new FlyWithWin());
//        Duck duck=new RubberDuck(new FlyNoWay());
        duck.display();
        duck.quack();
        duck.fly();
    }
}

3、策略模式的实现

从上述实例基本可以看出怎样使用策略模式:

  1. 通过分离变化得出策略接口:定义策略几口
  2. 提供策略接口的实现类:定义具体策略
  3. 在客户程序申明一个域为策略接口:组合+面向接口编程(Duck持有FlyStragety接口,而不是具体实现)
  4. 在客户程序中组装策略接口的实现类:注入实现类

4、策略模式的适用场景

  1. 许多相关的类仅仅是行为差异,可将差异分离出为策略接口,而相关的类作为策略算法
  2. 运行时选取不同的算法变体
  3. 通过条件语句在多个分支中选取一种行为

 

设计模式-策略模式

标签:接口   方法   实例   引用   可变   抽象类   动态   好的   测试   

原文地址:https://www.cnblogs.com/shixiemayi/p/9612836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!