zoukankan      html  css  js  c++  java
  • 设计模式整理_策略模式

      △策略模式用于在用户行为经常发生变化的情况下,将行为单独提取出来,定义算法族,采用组合的方式,分别封装起来,让他们可以互相替换,此模式,让算法的变化独立于使用算法的客户。

           该模式体现了如下设计模式的原则:

    1. 封装变化。
    2. 多用组合,少用继承。
    3. 针对接口编程,而不针对实现编程。

      在策略模式中,第一点体现了对于类中变化的部分,进行了封装,第二部分体现了将算法族的接口定义在类中,采用组合的形式来完成对于类行为的定义,第三部分体现了利用借口代表每个行为,而将接口的具体实现交给其实现类来完成。下面是代码示例,采用了Duck类,其中将可能会发生变化的类单独分离成FlyBehavior接口和QuackBehavior接口,然后再实现类中定义接口的行为。在Duck类中,采用将两个接口组合的方式,定义行为,由于类存在不需要变化的行为参数,因此Duck类设置为abstract。在Demo演示的时候,先是演示ModelDuck,随后改变其FlyBehavior。

        Duck类即子类:

     

    public abstract class Duck {
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
        public Duck(){}
        public abstract void display();
        public void performFly() {
            flyBehavior.fly();
        }
        public void performQuack() {
            quackBehavior.quack();
        }
        public void setFlyBehavior(FlyBehavior flyBehavior) {
            this.flyBehavior = flyBehavior;
        }
        public void setQuackBehavior(QuackBehavior quackBehavior) {
            this.quackBehavior = quackBehavior;
        }
    }
    class ModelDuck extends Duck{
        public ModelDuck() {
            flyBehavior = new FlyNoWay();
            quackBehavior=new Quack();
        }
        @Override
        public void display() {
            // TODO Auto-generated method stub
            System.out.println("I am a Model Duck.");
        }
        
    }

      FlyBehavior类即子类(可能变化的算法族)

     

    public interface FlyBehavior {
        public void fly();
    }
    class FlyWithWings implements FlyBehavior {
    
        @Override
        public void fly() {
            System.out.println("I am flying!");
        }
    }
    class FlyNoWay implements FlyBehavior {
    
        @Override
        public void fly() {
            // TODO Auto-generated method stub
            System.out.println("I can't fly.");
        }
        
    }
    class FlyWithRocket implements FlyBehavior {
    
        @Override
        public void fly() {
            // TODO Auto-generated method stub
            System.out.println("I am flying with Rocket!");
        }
        
    }

      QuackBehavior类即子类(可能变化的算法族)

    public interface QuackBehavior {
        public void quack();
    }
    class Quack implements QuackBehavior {
    
        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("Quack");
        }
        
    }
    class MuteQuack implements QuackBehavior {
    
        @Override
        public void quack() {
            // TODO Auto-generated method stub
            System.out.println("Silence.");
        }
        
    }

      演示类:

    public class Demo {
        public static void main(String[] args) {
            Duck duck=new ModelDuck();
            duck.performFly();
            duck.performQuack();
            duck.display();
            duck.setFlyBehavior(new FlyWithRocket());
            duck.performFly();
        }
    }

     UML图如下:

  • 相关阅读:
    虚方法的调用是怎么实现的(单继承VS多继承)
    C++ Data Member内存布局
    删除单链表,你会吗?
    最近面试遇到的Windows相关的题目
    C# 文章导航
    移动端开发文章导航
    Vue源码阅读(一) 准备工作
    vue-router源码阅读(一) 内部探究
    Vuex源码阅读(二) store内的getters实现逻辑
    Vuex源码阅读(一) new Vuex.Store()内部探究
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/5596396.html
Copyright © 2011-2022 走看看