策略模式的学习


strategy pattern:
1 when: purpose
2 what: principle
3 how : examples
4 in all;
5 tutorial  refer to url


STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。
       
策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

1 when: purpose
  (1) 如果在一个系统里含有许多的类,它们之间的区别仅在于它们的行为,应该使用策略模式动态的选择其中的一种.
  (2) 如果在一个系统里含有几种算法,需要动态的去选择其中的一种时,应该选择策略模式.
  (3) 如果一个系统算法的复杂性和涉及的数据不想让客户端知道,应该选择策略模式.
  (4) 如果一个对象有多种形为,应该使用策略模式来避免使用难以维护的多重条件语句来实现.
2 what: principle
  (1) 策略模式就是把行为和环境(Context)分割开来,环境负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中,由于算法和环境独立开来,算法的修改就不会影响到客户端.
  (2) 策略模式的结构
     
     这个模式涉及到三个角色:
       A 环境角色(Context):持有一个Strategy类的引用.
       B 抽象策略角色(Strategy):给出了所有具体角色类所需的接口,通常由一个接口或抽象类实现.
       C 具体策略角色(ConcreteStrategy):包装了相关的算法和行为.
   
    代码清单:
    ************************************************
    Context:
    package com.strategy;
   public class Context {
        private Strategy strategy;
       
        /**
         * strategy method
         */
        public void contextInterface() {
                strategy.strategyInterface();
        }
   }
  
   Strategy:
   package com.strategy;

   public abstract class Strategy {

        /**
         * strategy method
         */
        public abstract void strategyInterface();
   }    
  
   ConcreteStrategy:
   package com.strategy;

   import java.io.Serializable;

   public class ConcreteStrategy extends Strategy {

        @Override
        public void strategyInterface() {
               
        }
   }

    ************************************************
3 how: examples
  实例一:
    策略类(Strategy): Strategy.java(抽象类或接口)
    具体策略类(ConcreteStrategy) : Add,Substract,Multiply,Divide
    环境类(Context): Context上下文
   
    代码清单**************************************************************
Strategy:::

package com.javapattern.strategy.calculate01;

public abstract class Strategy {
        public abstract void operation(float a,float b);
}

Add::::
package com.javapattern.strategy.calculate;

public class Add extends Calculate {
        public void operation(float a,float b) {
                float add = a + b;
                System.out.println("the result of a add b is " + add);
        }
}

Substract::::
package com.javapattern.strategy.calculate;

public class Substract extends Calculate {
        public void operation(float a,float b) {
                float substract = a - b;
                System.out.println("the result of a substract b is " + substract);
        }
}

Multiply::::
package com.javapattern.strategy.calculate;

public class Multiply extends Calculate {
        public void operation(float a,float b) {
                float multiply = a * b;
                System.out.println("the result of a * b is " + multiply);
        }
}

Context::::
package com.javapattern.strategy.calculate01;

public class Context {
        private Strategy strategy;
       
        final static Strategy add = new Add();
        final static Strategy substract = new Substract();
        final static Strategy multiply = new Multiply();
        final static Strategy divide = new Divide();
       
        public void operation(float a,float b) {
                strategy.operation(a, b);
        }
}

测试类::::
package com.javapattern.strategy.calculate01;

public class Test {
        public static void main(String[] args) {
                float a = 100;
                float b = 100;
               
                Context.add.operation(a,b);
                Context.substract.operation(a, b);
                Context.multiply.operation(a, b);
                Context.divide.operation(a, b);
        }
}

实例二:
  图书折扣的算法:
       
   图书销售中的折扣计算问题,假设有三种折扣三种算法:
   算法一: 没有折扣,返回0为折扣值.
   算法二: 一元的折扣.
   算法三: 百分比折扣,比如一本书的价格为20,折扣百分比为7%,则折扣价为20*7%=1.4
          
   角色分配:
   策略类(Strategy): DiscountStrategy.java
     具体策略类(ConcreteStrategy) : 算法一二三 NoDiscountStrategy.java,FlatRateStrategy.java,PrecentageStrategy.java
     环境类(Context): DiscountContext.java
    
     结构图:
    
     代码清单:****************************************
context::::::::

package com.javapattern.strategy.booksales01;

public class ContextStrategy {
        private DiscountStrategy strategy = null;
       
        public ContextStrategy(DiscountStrategy strategy) {
                this.strategy = strategy;
        }
       
        public double calculateStrategy() {
                return this.strategy.calculateStrategy();
        }
}

strategy::::::

package com.javapattern.strategy.booksales01;

/**
 * strategy class
 * @author Administrator
 *
 */
public abstract class DiscountStrategy {
        public double price = 0;
        public int copies = 0;
        
        public DiscountStrategy(double price,int copies) {
                this.price = price;
                this.copies = copies;
        }
       
        public abstract double calculateStrategy();
}

ConcreteStrategy::::::

package com.javapattern.strategy.booksales01;

/**
 * concreteStrategy class
 * @author Administrator
 *
 */
public class NoDiscountStrategy extends DiscountStrategy {
       
        public NoDiscountStrategy(double price,int copies) {
                super(price,copies);
        }
       
        public double calculateStrategy() {
                return 0;
        }
}

package com.javapattern.strategy.booksales01;

/**
 * concreteStrategy
 * @author Administrator
 *
 */
public class FlatDiscountStrategy extends DiscountStrategy {
        private double amount = 10;
       
        public FlatDiscountStrategy(double price,int copies) {
                super(price,copies);
        }
       
        public double calculateStrategy() {
                return copies * amount;
        }
       
        public void setAmount(double amount) {
                this.amount = amount;
        }
       
        public double getAmount() {
                return amount;
        }
}

package com.javapattern.strategy.booksales01;

/**
 * concreteStrategys class
 * @author Administrator
 *
 */
public class PrecentageDiscountStrategy extends DiscountStrategy {
        private double precentage = 0.2;
       
        public PrecentageDiscountStrategy(double price,int copies) {
                super(price,copies);
        }
       
        public double calculateStrategy() {
                return price * copies * precentage;
        }
       
        public void setPrecentage(double precentage) {
                this.precentage = precentage;
        }
       
        public double getPrecentage() {
                return precentage;
        }
}

测试类::::

package com.javapattern.strategy.booksales01;

public class Test {
        public static void main(String[] args) {
                double price = 100;
                int copies = 2000;
                double discountAmt = 0;
               
//                DiscountStrategy noDiscountStrategy = new NoDiscountStrategy(price,copies);
//                DiscountStrategy flatDiscountStrategy = new FlatDiscountStrategy(price, copies);
                DiscountStrategy flatDiscountStrategy = new PrecentageDiscountStrategy(price, copies);
               
                ContextStrategy ctx = new ContextStrategy(flatDiscountStrategy);
                discountAmt = ctx.calculateStrategy();
                System.out.println("discount amount is " + discountAmt);
        }
}
 
    *************************************************  
   
  
    **********************************************************************

5 tutorial  refer to url
 
  <<java and pattern>>
  晨曦视频
  GOF

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值