head fiest 设计模式第一章

设计准则
面向接口编程而不是实现类
多用组合少用继承
封装将变的分离出来不变的抽出来,很多设计都是有这个演变出来的
第一章讲解的模式是策略模式
作者以设计一个鸭子类的游戏为开端讲解的。Duck类为所有鸭子类的超类,其他类可以继承他
Dack鸭子类里面有多个方法fly  behavior  eat但是有些鸭子是不会飞的这又如何解决。
其一是将fly方法移植出来,用一个专门的接口进行实现。对应的鸭子类继承Duck类implements接口,
但是假设有一百个不同的fly跟其他不同的行为难道要写一百个吗。

能想到的方法是设计fly,behavior and so on接口,然后设计与鸭子类无关的类,这样我们就可以
进行复用。而设计出来的类与鸭子无关。
具体设计以及代码如下:
行为类
public interface Behavior
{
      public void behaviorQueck();
}

行为类的实现类
public class BehaviorImple implements Behavior
{
      @Override
      public void behaviorQueck()
     {
         System. out .println( "吱吱叫" );    
     }
}
飞行接口
public interface Fly
{
      public void flyQuck();
}
实现接口的实现类
public class FlyImpl implements Fly
{
      public void flyQuck()
     {
         System. out .println( "会飞的鸭子" );
         
     }
}

and  so  on的一些类以及实现方法
鸭子类
//有了继承的复用的好处,却没有继承所带来的包袱
public class Duck
{
      // 引用鸭子
      // 利用多态
     Behavior behavior ;
     Fly fly ;
    //鸭子的动作
      public void performQuack()
     {
          behavior .behaviorQueck();
     }
      //鸭子飞
      public void performFly()
     {
          fly .flyQuck();
     }
      public void swin()
     {
         System. out .println( "鸭子游泳啊啊啊" );
     }
}
绿头鸭类
//这里初始化的时候做的还不够完善没有弹性不能动态的改变
public class MalGreenDuck extends Duck
{
      public MalGreenDuck()
     {
          behavior = new BehaviorImple();
          fly = new FlyImpl();
     }
      public void display()
     {
         System. out .println( "这是一个绿头鸭" );
     }
     
}

测试类
public class TestJava
{
      @Test
      public void testDuck()
     {  
         Duck greenDuck = new MalGreenDuck();
          greenDuck .performFly();
          greenDuck .performQuack();
     }
}

上面我们提到了初始化的时候还不够灵活现在那让我们动态的设定行为
第一在Duck类中添加一个方法
鸭子类
public class Duck
{
      // 引用鸭子
      // 利用多态
       //这样的方式利用接口然后就与鸭子类无关,就可以实现复用,只要可以用的鸭子类能利用的类都可以用了。真正实现复用
     Behavior behavior ;
     Fly fly ;
       //添加这样一个方法之后就可以动态的改变鸭子的行为
     public void setFly(FlyImpl fly )
     {
          this . fly = fly ;
     }
     //鸭子的动作
      public void performQuack()
     {
          behavior .behaviorQueck();
     }
      //鸭子飞
      public void performFly()
     {
          fly .flyQuck();
     }
      public void swin()
     {
         System. out .println( "鸭子游泳啊啊啊" );
     }
}
制造一个新的鸭子类
public class ModelDuck extends Duck
{
      public ModelDuck()
     {
          fly = new FlyImpl();
          behavior = new BehaviorImple();
     }
    public void display()
    {
     System. out .println( "im is a modelDuck" );
    }
}
动态的改变
@Test
public void modelDuck()
{
         Duck model = new ModelDuck();
          model .performFly();
          model .performQuack();
          //利用接口动态的改变
          model .setFly( new FlySuperImpl());
          model .performFly();    
     }
}


策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值