策略模式

2017-05-03  本文已影响12人  MrWu_

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

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

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

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

针对实现编程

假设有一个抽象类,有两个具体实现(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图

结构

模式的组成:

上一篇下一篇

猜你喜欢

热点阅读