zoukankan      html  css  js  c++  java
  • 【Java】Strategy Pattern

    前言

      如果说,商场打折针对不同的时节,比如双十一、圣诞节、春节这些值得促销的好日子,进行不同程度的降价打折从而获得最大程度上的收益,如果有一群鸭子,只会游泳、嘎嘎叫,但是某一天某种类型的鸭子学会了飞,那群里面的鸭子并不会飞。这样的话还有修改以前的封装好的算法,然后添加飞翔的功能,这个时候,就得考虑一下设计原则。对扩展开放,对修改封闭。针对这种算法经常变化的情况,将这些算法封装起来,独立于不变的成分,保证增加新的算法的同时,对不变的地方不添加修改。下面采用 Strategy Pattern 进行实现。分别从UML图分析和代码两个方面进行分析。

    内容

    精华:

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

    原则:

        ·将变化的地方封装起来了(封装变化)。

       ·多用组合,少用继承。

       ·针对接口编程,不针对实现。

    UML图



    DEMO部分:

    说明:以下的代码为左半部分抽象类与子类继承抽象类,从而子类继承抽象类的属性和行为,其中的setFlyBehavior和setQuackBehavior方法作用可以在客户端调用该对象的时候动态添加鸭子的行为。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">package Duck;
    
    /*
     * author:zhoulitong
     */
    abstract class Duck{
    	FlyBehavior flyBehavior;
    	QuackBehavior quackBehavior;
    	
    	//表演一个叫的动作
    	public void performQuack(){
    		quackBehavior.quack();
    	}
    	
    	//表演一个飞的动作
    	public void performFly(){
    		flyBehavior.fly();
    	}
    	
    	public abstract void display();
    	
    	//有了这个方法可以动态改变鸭子的行为了
    	public void setFlyBehavior(FlyBehavior fb){
    		flyBehavior = fb;
    	}
    	
    	public void setQuackBehavior(QuackBehavior qb){
    		quackBehavior = qb;
    	}
    }
    
    class MallardDuck extends Duck{
    	public MallardDuck(){
    		quackBehavior = new Quack();//实例化叫的实例
    		flyBehavior = new FlyWithWings();//实例化飞的实例
    	}
    	
    	public void display(){
    		System.out.println("小鸭是一个真正的鸭子!不是白天鹅");
    	}
    }</span>

    说明:接口部分,这部分的代码是封装了变化的部分,从而让变化的部分独立于不变的部分,让这个设计模式更加的符合开闭原则,在这里,接口部分盛放的是鸭子的功能,鸭子表现行为的时候,分别利用多态进行按需求实例化自己想要的那部分功能行为。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">/*
     * author:zhoulitong
     */
    //声明一个公共接口(类似于抽象类的功能)
    interface QuackBehavior {
    	void quack();//声明一个呱呱叫的方法
    }
    
    class Quack implements QuackBehavior{
    	public void quack(){
    		//实现鸭子呱呱叫
    	}
    }
    
    class Squeak implements QuackBehavior{
    	public void quack(){
    		//实现橡皮鸭吱吱叫的方法
    	}
    }
    
    class MuteQuack implements QuackBehavior{
    	public void quack(){
    		//什么都不做,不会叫
    	}
    }
    
    interface FlyBehavior{
    	void fly();//声明一个飞的接口方法
    }
    
    class FlyWithWings implements FlyBehavior{
    	public void fly(){
    		//实现鸭子的飞行动作
    	}
    }
    
    class FlyNoWay implements FlyBehavior{
    	public void fly(){
    		//什么都不做,不会飞
    	}
    }
    
    class FlyRocketPowered implements FlyBehavior{
    	public void fly(){
    		
    	}
    }</span>
    说明:客户端代码部分,申请一个对象的实例,采用了多态机制,实例化了一个实际存在的鸭子对象,分别执行行为。
    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class MiniDuckSimulator{
    	public static void main (String[] args){
    		Duck mallard = new MallardDuck();//实例化一个鸭子
    		mallard.performFly();//飞的动作
    		mallard.performQuack();//叫的动作
    		
    		//如果又增加了一个动作,可以通过Duck父类中的set方法对实例化的对象进行附加
    		//在运行时想要改变鸭子的行为,只需要调用鸭子的setter方法就可以了。
    		mallard.setFlyBehavior(new FlyRocketPowered());
    		mallard.performFly();
    	}
    }</span>

    小结

      上面就是策略模式一个小小的应用,希望在后期有更多实践。


    感谢您的宝贵时间···



  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412333.html
Copyright © 2011-2022 走看看