zoukankan      html  css  js  c++  java
  • 深入浅出设计模式学习笔记一:设计模式简介以及策略模式

    设计模式

    1、定义:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结

    2、优点:代码复用,易于维护,易于理解性,保证代码的可靠性

    3、分类:设计模式分为3种类型,共23种模式 

      创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

      结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

      行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    4、软件设计的6大原则:

      1)开闭原则(Open Closed Principle,OCP)

        开闭原则指的是对扩展开放,对修改关闭。

      2) 迪米特法则(最小知识原则)(Principle of Least Knowledge,PLK)

      3)里氏代换原则(Liskov Substitution Principle,LSP)

      4)依赖倒转原则(Dependency Inversion Principle,DIP)

      5)接口隔离原则(Interface Segregation Principle,ISP)

      6)单一职责原则 (SRP Single responsibility principle)

    设计模式背后所秉承的精神所在是很多的设计原则:

    1、把会变化的部分取出来并封装起来,以便以后可以轻易的改动或扩充此部分,而不影响不需要变化的其他部分

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

    3、多用组合,少用继承:组合就是将两个类结合起来使用,使用组合建立系统具有很大的弹性

    设计模式:

    1、策略模式(Strategy Pattern):策略模式定义了算法族,并将其分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

     组成:

     举例说明:鸭子模拟器的设计

      1 /**
      2  * 所有飞行行为必须实现的接口
      3  */
      4 interface FlyBehavior {    
      5     public void fly();
      6 }
      7 /**
      8  * 所有呱呱叫行为必须实现的接口
      9  */
     10 interface QuackBehavior {    
     11     public void quack();
     12 }
     13 /**
     14  * 飞行行为的具体实现1:可以飞行
     15  */
     16 class FlyWithWings implements FlyBehavior {
     17     @Override
     18     public void fly() {        
     19         System.out.println("I am flying!");        
     20     }    
     21 }
     22 /**
     23  * 飞行行为的具体实现2:不会飞行
     24  */
     25 class FlyNoWay implements FlyBehavior{
     26     @Override
     27     public void fly() {
     28         System.out.println("I can not fly!");    
     29     }    
     30 }
     31 /**
     32  * 呱呱叫行为的具体实现1:呱呱叫
     33  */
     34 class Quack implements QuackBehavior{
     35 
     36     @Override
     37     public void quack() {
     38         System.out.println("Quack");        
     39     }    
     40 }
     41 /**
     42  * 呱呱叫行为的具体实现2:吱吱叫
     43  */
     44 class Squeak implements QuackBehavior{
     45     @Override
     46     public void quack() {
     47         System.out.println("Squeak");        
     48     }    
     49 }
     50 /**
     51  * 抽象类,是所有鸭子的超类,在该类中,定义了行为类型接口的引用变量
     52  */
     53 abstract class Duck{
     54     
     55     FlyBehavior flyBehavior;
     56     QuackBehavior quackBehavior;
     57     
     58     public void setFlyBehavior(FlyBehavior flyBehavior) {
     59         this.flyBehavior = flyBehavior;
     60     }
     61     public void setQuackBehavior(QuackBehavior quackBehavior) {
     62         this.quackBehavior = quackBehavior;
     63     }
     64     
     65     public abstract void dispaly();
     66     
     67     //将鸭子的行为实现委托给行为类    
     68     public void fly(){
     69         flyBehavior.fly();
     70     }
     71     
     72     public void quack(){
     73         quackBehavior.quack();
     74     }
     75 }
     76 
     77 /**
     78  * 定义model duck子类继承超类duck,并实现超类中的抽象方法
     79  */
     80 class ModelDuck extends Duck{
     81     
     82     public ModelDuck(){
     83         
     84         flyBehavior = new FlyNoWay(); 
     85         quackBehavior = new Quack();
     86     }     
     87     @Override
     88     public void dispaly() {
     89         System.out.println("I am a model duck!");
     90     }    
     91 }
     92 /**
     93  * 测试类
     94  */
     95 public class TestModel{
     96     
     97     public static void main(String[] args) {
     98         
     99         Duck model = new ModelDuck();
    100         model.fly();
    101         model.quack();
    102         System.out.println("动态更改行为---");
    103         //调用鸭子的setter方法,在运行时改变鸭子的行为
    104         model.setFlyBehavior(new FlyWithWings());
    105         model.setQuackBehavior(new Squeak());
    106         model.fly();
    107         model.quack();
    108         
    109     }
    110     
    111 }
    View Code

     运行结果:

  • 相关阅读:
    【零基础】极星9.5套利详解
    【零基础】极星9.3资金字段详解
    【零基础】易盛9.0API入门三:下单并查询订单状态
    【零基础】极星量化扩展一:如何做跨合约的交易
    【零基础】极星9.3止盈止损用法详解
    【零基础】极星9.3几种套利的说明
    【零基础】MT4量化入门三:写一个双均线指标
    概率与似然
    PCA的计算方法
    隐藏节点数的选择
  • 原文地址:https://www.cnblogs.com/miaowu1314/p/5364331.html
Copyright © 2011-2022 走看看