美文网首页
策略模式

策略模式

作者: 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