设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分去除并“封装”起来,好让其他部分不会受到影响。
针对接口编程,而不是针对实现编程
针对超类型编程可以更明确地说成“变量”的声明类型应该是超类型,通常是一个抽象类或者是一个接口
针对实现编程
假设有一个抽象类,有两个具体实现(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接口实现某具体算法。