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>

    小结

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


    感谢您的宝贵时间···



  • 相关阅读:
    AIX上Oracle安装10204补丁出现写文件错误
    Oracle自定义函数
    表中最大分区数
    查询RMAN资料库——RMAN用户手册
    查询访问同一表的两个以上索引(三)
    管理RMAN资料库——RMAN用户手册
    查询访问同一表的两个以上索引(一)
    DDL语句为什么不能回滚
    JDBC运行出现ORA17410错误
    MySQL数据库操作类(转)
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412333.html
Copyright © 2011-2022 走看看