设计模式 - 策略模式

来源:互联网 发布:淘宝导航栏字体加粗 编辑:程序博客网 时间:2024/06/05 21:55

策略模式

策略模式体现了两个非常基本的面向对象设计的原则封装变化的概念编程中使用接口,而不是对接口的实现(接口的实现类)策略模式定义定义一组算法,将每个算法封装起来,并且使他们之间可以互换策略模式使这些算法在客户端调用他们的时候能够互不影响的变化策略模式的意义策略模式可以使开发人员开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接关系弱连接的特性是使软件具有更强的可扩展性,易于维护,更重要的是,大大提高了软件的重用性策略模式的组成部分抽象策略角色:策略类,通常由接口或者抽象类实现具体策略角色:包装了相关的算法和行为环境角色:只有一个策略类的引用,最终给客户端用举例:class MyComparator implements Comparator{}TreeSet set = new TreeSet(new MyComparator());Comparator抽象策略角色MyComparator具体策略角色(实现了抽象策略类)TreeSet环境角色(TreeSet自己本身不具有排序的功能,它是借助与给它传进来的具体策略类的对象的规则进行排序的)策略模式的实现策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使他们可以互相替换策略模式使算法不影响客户端的情况下发生变化.使用策略模式可以把行为和环境分开环境类负责维持和查询行为类,各种算法则在具体策略中提供由于算法和环境独立开了,算法的修改都不会影响环境和客户端策略模式的编写步骤1.对策略对象定义一个公共接口相当于Comparator接口2.编写策略类,该类实现了上面的接口相当于Comparator接口的具体实现类,具体策略类可以有多个3.使用策略对象的类中保存一个对策略对象的引用在TreeSet当中保存了一个Comparator接口类型的一个引用4.在使用策略对象的类中,实现对策略对象的set()和get()(注入)或者使用构造方法完成赋值实现自己的策略模式策略模式的缺点客户端必须知道所有策略类,并自行决定使用那一个策略类造成很多的策略类策略模式缺点的解决方法采用工厂方法
实现自己的策略模式
package com.itlwc;public class Test {public static void main(String[] args) {Environment e = new Environment(new AddStrategy());System.out.println(e.calculate(6, 3));e.setStrategy(new SubtractStrategy());System.out.println(e.calculate(6, 3));e.setStrategy(new MultiplyStrategy());System.out.println(e.calculate(6, 3));e.setStrategy(new DivideStrategy());System.out.println(e.calculate(6, 3));}}// 抽象策略角色interface Strategy {public int calculate(int a, int b);}// 具体策略角色(加法)class AddStrategy implements Strategy {public int calculate(int a, int b) {return a + b;}}// 具体策略角色(减法)class SubtractStrategy implements Strategy {public int calculate(int a, int b) {return a - b;}}// 具体策略角色(乘法)class MultiplyStrategy implements Strategy {public int calculate(int a, int b) {return a * b;}}// 具体策略角色(除法)class DivideStrategy implements Strategy {public int calculate(int a, int b) {return a / b;}}// 环境角色class Environment {Strategy strategy;public Environment(Strategy s) {this.strategy = s;}public Strategy getStrategy() {return strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public int calculate(int a, int b) {return strategy.calculate(a, b);}}


原创粉丝点击