美文网首页
策略模式

策略模式

作者: 麦黄与微风 | 来源:发表于2018-12-08 23:11 被阅读0次

    此文为《Head First 设计模式》章节1读书笔记。文中的编程实例为仿照书中示例编写的,感觉逻辑上稍有欠缺,但是整体上体现了策略模式的核心思想:动态应对需求变更。待日后遇到更恰当的例子再做更改。

    OO基本特性

    • 抽象
    • 封装
    • 继承
    • 多态

    OO设计原则

    • 封装变化:独立出应用中可能会变化的部分;
    • 多用组合,少用继承;
    • 针对超类型(SuperType)进行编程,而不是针对实现编程。

    OO设计模式

    策略模式

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

    “继承”机制只适用于所有子类都具有和父类同样行为(共性行为)的情况,所以当某些子类不具有共性行为时,应该将之前是共性的行为从父类和所有子类中剔除(不能直接将共性行为声明为接口,让具有该行为的子类实现 -> 代码不能重用,造成代码重复),将共性行为抽象成接口(行为接口),并建立一组新类来代表每个具体行为类(行为子类),而原来的父类就可以将行为“委托”给行为子类处理(需要在父类中先声明行为接口类型的变量,调用共性行为方法,再在继承自父类的子类中用具体的行为子类进行赋值)。

    示例

    package me.yobol.designpattern.strategy;
    
    /**
      * 行为接口
      */ 
    public interface SpeakBehavior {
    
        public void speak();
    }
    
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 实现行为接口SpeakBehavior的具体行为类
      */
    public class Speak implements SpeakBehavior {
    
        @Override
        public void speak() {
            System.out.println("I can speak commonly!");
        }
    }
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 实现行为接口SpeakBehavior的具体行为类
      */
    public class Mute implements SpeakBehavior {
    
        @Override
        public void speak() {
            System.out.println("Wu la wu la...");
        }
    }
    
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 行为接口
      */
    public interface WalkBehavior {
    
        public void walk();
    }
    
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 实现行为接口WalkBehavior的具体行为类
      */
    public class Walk implements WalkBehavior {
    
        @Override
        public void walk() {
            System.out.println("I can walk commonly!");
        }
    }
    
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 实现行为接口WalkBehavior的具体行为类
      */
    public class WalkWithStick implements WalkBehavior {
    
        @Override
        public void walk() {
            System.out.println("My beg hurt,so I walk with sticks");
        }
    }
    
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 父类
      */
    public abstract class Person {
    
        public SpeakBehavior speakBehavior;
        public WalkBehavior walkBehavior;
    
        public void setSpeakBehavior(SpeakBehavior speakBehavior){
            this.speakBehavior = speakBehavior;
        }
    
        public void setWalkBehavior(WalkBehavior walkBehavior){
            this.walkBehavior = walkBehavior;
        }
    
        public abstract void represent();
    
        public void performSpeak(){
            speakBehavior.speak();
        }
        public void performWalk(){
            walkBehavior.walk();
        }
    }
    
    
    package me.yobol.designpattern.strategy;
    
    /**
      * 继承自父类Person的子类
      */
    public class CommonPerson extends Person {
    
        public CommonPerson() {
            this.speakBehavior = new Speak();
            this.walkBehavior = new Walk();
        }
    
        @Override
        public void represent() {
            System.out.println("I am so ugly!");
        }
    }
    
    
    package me.yobol.designpattern.strategy;
    
    public class Main {
    
        public static void main(String[] args) {
            Person p = new CommonPerson();
            p.performSpeak();
            p.performWalk();
            p.setWalkBehavior(new WalkWithStick());
            p.performWalk();
        }
    }
    

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/stgchqtx.html