• java常用设计模式学习心得


    学习自:http://shenzhenchufa.blog.51cto.com/730213/161581

    代码来自:http://shenzhenchufa.blog.51cto.com/730213/161581

    感谢博主:shenzhenchufa。

    学习之余我写一些自己的心得。无心侵犯版权,用于自己学习。

    ------------------------- strategy(策略模式) -------------------------
    我们有一个设计原则:
    找出应用中相同之处,且不容易发生变化的东西,把它们抽取到抽象类中,让子类去继承它们;
    找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 -->important.

    现在,为了要分开“变化和不变化的部分”,我们准备建立两组类(完全远离Duck类),一个是"fly"相关的,另一个
    是“quack”相关的,每一组类将实现各自的动作。比方说,我们可能有一个类实现“呱呱叫”,另一个类实现“吱吱
    叫”,还有一个类实现“安静”。
    首先写两个接口。FlyBehavior(飞行行为)和QuackBehavior(叫的行为).
     public interface FlyBehavior{
         public void fly();     
     }
     public interface QuackBehavior{
         public void quack();
     }

    我们在定义一些针对FlyBehavior的具体实现。

    public class FlyWithWings implements FlyBehavior{
        public void  fly(){
         //实现了所有有翅膀的鸭子飞行行为。
       }
     }
    public class FlyNoWay implements FlyBehavior{
     
        public void  fly(){
          //什么都不做,不会飞
        }
     }   

    针对QuackBehavior的几种具体实现。

    public class Quack implements QuackBehavior{
        public void quack(){
          //实现呱呱叫的鸭子
      }
    }
     
    public class Squeak implements QuackBehavior{
        public void quack(){
          //实现吱吱叫的鸭子 
      }
    }
     
    public class MuteQuack implements QuackBehavior{
        public void quack(){
          //什么都不做,不会叫
      }
    }

    点评一:
    这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。而我们增加一些新

    的行为,不会影响到既有的行为类,也不会影响“使用”到飞行行为的鸭子类。
    最后我们看看Duck 如何设计。
    public class Duck{        --------->在抽象类中,声明各接口,定义各接口对应的方法.
          FlyBehavior flyBehavior;//接口
          QuackBehavior quackBehavior;//接口
           public Duck(){}
           public abstract void display();
           public void swim(){
            //实现游泳的行为
            }
           public void performFly(){
                flyBehavior.fly();  -->由于是接口,会根据继承类实现的方式,而调用相应的方法.
         }
         public void performQuack(){
              quackBehavior.quack();();
        }
     }

    看看MallardDuck如何实现。
    ----->通过构造方法,生成'飞','叫'具体实现类的实例,从而指定'飞','叫'的具体属性

    public class MallardDuck extends Duck{
           public MallardDuck {       
            flyBehavior = new FlyWithWings ();
            quackBehavior = new Quack(); 
          //因为MallardDuck 继承了Duck,所有具有flyBehavior 与quackBehavior 实例变量}
        public void display(){
         //实现
       }
     }

    这样就满足了即可以飞,又可以叫,同时展现自己的颜色了。

    这样的设计我们可以看到是把flyBehavior ,quackBehavior 的实例化写在子类了。我们还可以动态的来决定。
      我们只需在Duck中加上两个方法。
     
    在构造方法中对属性进行赋值与用属性的setter的区别:
    构造方法中对属性进行赋值:固定,不可变;
    用属性的setter,可以在实例化对象后,动态的变化,比较灵活。
     public class Duck{
          FlyBehavior flyBehavior;//接口
          QuackBehavior quackBehavior;//接口
          public void setFlyBehavior(FlyBehavior flyBehavior){
                this.flyBehavior = flyBehavior;
         }
        public void setQuackBehavior(QuackBehavior quackBehavior  {
                this.quackBehavior= quackBehavior;
         }
     }

    策略模式:我本身具有几种不确定的行为,不知道行为应该如何具体进行表现,当我收到一个具体的行为,我根据具体的行为进行表现。

  • 相关阅读:
    多线程学习纪要
    字符编码ASCII、Unicode、UTF-8以及验证
    C# 自定义特性Attribute要点
    Java --- 流操作
    数据库 --- 索引
    Java -- 枚举
    mybatis --- 使用通用mapper或者mybatis-plus进行映射时,当数据库中有大写字母,自定义映射的字段名。
    后端 --- 快速创建一个sb项目 (使用spring官网的https://start.spring.io)
    数据库 --- decimal类型测试
    Java --- 线上故障调优01 打印堆栈信息
  • 原文地址:https://www.cnblogs.com/v-weiwang/p/4809857.html
Copyright © 2020-2023  润新知