美文网首页
策略模式

策略模式

作者: MrWu_ | 来源:发表于2017-05-03 20:36 被阅读12次

    设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

    把会变化的部分去除并“封装”起来,好让其他部分不会受到影响。

    针对接口编程,而不是针对实现编程

    针对超类型编程可以更明确地说成“变量”的声明类型应该是超类型,通常是一个抽象类或者是一个接口

    针对实现编程

    假设有一个抽象类,有两个具体实现(Dog与Cat)继承Animal

    
    Dog d=new Dog();
    
    d.bark();
    
    

    针对接口或者超类型编程

    
    Animal animal=new Dog();
    
    animal.makeSound();
    
    

    关系(is-a)与(has-a)

    当你将两个类结合起来使用,这就是组合。

    设计原则:多用组合,少用继承。

    现在来具体实现一个策略模式:、

    
    public abstract class Duck{
    
    //为行为接口类型声明两个引用变量
    
    FlyBehavior fiyBehavior;
    
    QuackBehavior quackBehavior;
    
    public Duck{}
    
    public abstract void display();
    
    public void performFly(){
    
    //委托行为类
    
    flyBehavior.fly();
    
    }
    
    public void performQuack(){
    
    QuackBehavior.quack();
    
    }
    
    public void swim(){
    
    System.out.println("all ducks float,even decoys");
    
    }
    
    //动态设定行为
    
    public void setFlyBehavior(FlyBhhavior fb){
    
    flyBehavior=fb;
    
    }
    
    public void setQuackBehavior(QuackBehavior qb){
    
    quackBehavior=qb;
    
    }
    
    }
    
    //所有飞行行为必须实现的接口
    
    public interface FlyBehavior{
    
    public void fiy();
    
    }
    
    public class FluyWithWings inplements FlyBehavbior{
    
    public void fly(){
    
    System.out.println("im flying");
    
    }
    
    }
    
    public FlyNoWay implements FlyBehavior{
    
    public void fly(){
    
    System.out.println("i cant fly");
    
    }
    
    }
    
    public interface QucakBehavior{
    
    public void quack();
    
    }
    
    public class Quack implements QuackBehavior{
    
    public void quack(){
    
    System.out.println("quack");
    
    }
    
    }
    
    public class MuteQuack implements QuackBehavior{
    
    public void quack(){
    
    System.out.println("slience");
    
    }
    
    }
    
    public class Squeak implements QuackBehavior{
    
    public void quack(){
    
    System.out.println("squeak");
    
    }
    
    }
    
    //组合实现
    
    public class MallDuck extends Duck{
    
    public MallDuck(){
    
    quackBehavior=new Quack();
    
    flyBehavior=new FlyWithWings();
    
    }
    
    public void display(){}
    
    //编译运行测试类
    
    public class Test{
    
    pubic static void main(String arg0){
    
    Duck mall=new MallDuck();
    
    mall.performQuack();
    
    mall.performFly();
    
    }
    
    }
    
    

    UML图

    结构

    模式的组成:

    • 环境类:用一个concreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据

    • 抽象策略类(Strategy):定义所有支持的算法的公共接口。

    • 具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/igjltxtx.html