head first 设计模式总结(一)策略模式

来源:互联网 发布:淘宝零食店加盟 编辑:程序博客网 时间:2024/04/24 11:50

设计原则

(1)      封装变化

(2)      多用组合,少用继承

(3)      针对接口编程,不针对实现编程

定义

       定义算法簇,分别封闭起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

举例

       公司要设计一套模拟鸭子的游戏,游戏中会出现各种各样的鸭子,一边游泳戏水,一边呱呱叫,设计如下:


Duck是一个抽象类,由于每个鸭子的外观不同,所以display()方法为抽象方法,由子类来具体实现。

       公司需要创新,在鸭子中加入飞行的方法,设计如下:



在超类中加入fly()方法后,就会导致所有的子类都具有fly()方法,就连那些不能飞的鸭子也不能免除,quack()方法也是如此,并不是所有的鸭子都是呱呱叫,橡皮鸭不是呱呱叫,是吱吱叫,还有些鸭子不会叫,也不会飞,如诱饵鸭(木头假鸭)。当出现这种鸭子时,我们唯一能做的就是在子类中覆盖这些方法,即要修改所有不会飞的鸭子重写fly()方法,而且后期如果加入其它的鸭子,就要考虑是否要重写fly()和quack()方法,这简直就是无穷无尽的恶梦,这种设计超类一但改变,就会牵连到所有的子类,无疑是不好的。

       封装变化

       这时我们想到设计原则中的第一条“封装变化”。将变化的地方独立出来,不要和那些不变化的代码混在一起,这样使得代码变化引起的后果变少系统更具有弹性。在此设计中,变化的地方是fly()和quack()方法,因此我们把这两人个方法提出来,建立一组新的类来代表第个行为。

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

       定义两个接口,FlyBehavior和QuackBehavior


       多用组合,少用继承

       在Duck类中使用组合的方法,来调用FlyBehavior和QuackBehavior两人个接口的方法,但具体使用接口的哪个实现类,由子类来确定

我们要想让设计更具有弹性,就应该可以动态的指定它们的行为,即在鸭子类中加入设定行为的方法

具体代码如下:

1、Duck

Public abstractclass Duck{

       FlyBehavior flyBehavior;

       QuackBehavior quackBehavior;

       public Duck(){

}

 

Public abstract void display();


Public void swim(){

       System.out.println(“swim”);

}

 

Public void setFlyBehavior(FlyBehavior fb){

       This.flyBehavior = fb;

}

 

Public void setQuackBehavior(QuackBehavior qb){

       This.quackBehavior = qb;

}

 

Public void performFly(){

       flyBehavior.fly();

}

 

Public void performQuack(){

       quackBehavior.fly();

}

}

2.FlyBehavior接口及其实现

       Public interface FlyBehavior{

              Public void fly();

}

 

Public class FlyWithWings implements FlyBehavior{

       Public void fly(){

              System.out.println(“flywith wings”);

}

}

 

Public class FlyNoWay implements FlyBehavior{

       Public void fly(){

              System.out.println(“flyno way”);

}

}

       3.QuackBehavior接口及其实现

       Public interface QuackBehavior{

              Public void quack();

}

 

Public class Quack  implementsQuackBehavior {

       Public void quack (){

              System.out.println(“quack”);

}

}

 

Public class MuteQuack implements QuackBehavior {

       Public void quack (){

              System.out.println(“MuteQuack”);

}

}

 

Public class Squeak implements QuackBehavior {

       Public void quack (){

              System.out.println(“Squeak”);

}

}

       4.MallardDuck

              Publicclass MallardDuck extends Duck{

       PublicMallarDuck(){

              quackBehavior= new Quack();

              flyBehavior= new FlyWithWings;

}

 

Public voiddisplay(){

       System.out.println(“mallard duck”);

}

 

}

最终设计如下:


原创粉丝点击