又和大家见面了。可以坚持写出第二篇文章真不错,好好加油。

<<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了。哪家商场收银软件强,开玩笑了。

读过上篇文章《《简单工厂模式》》的知道,它有两个缺点:1、client依赖两个类。耦合性高;2、假设算法过多则须要写非常多类。解决上面问题的就是策略模式了。

策略模式:它定义了算法家族。分别封装起来。让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户。

商场收银软件:单位价格*打折算法=售价。对于这种软件来说,须要常常变化的是打折算法。其有用简单工厂模式全然能够的。直接添加打折算法,然后工厂生产实例对象就能够了。

可是这个模式知识解决对象创建问题,并且因为工厂本身包含了全部收费方式,商场是可能常常更改打折算法的,每次维护或扩展收费方式都要修改这个工厂。这样是很麻烦也不遵循易扩展、易复用原则。事实上分析一下该软件的变化点就是打折算法,我们仅仅要将这个变化点封装起来就行了,而策略模式可以做到这一点。

好了。上代码了。依据样例学习进步快

1、策略类,定义了全部算法实现的公共方法接口

/*

*
策略类

*/

publicabstractclass Strategy {

/*

*
定义全部算法的公共接口

*/

publicabstractvoid algorithmlnterface();

}

、维护一个对Strategy类的引用。想调用那个类就调用那个类

/*

*
维护对strategy对象的引用

*/

publicclass Context {

Strategystrategy;

public Context(Strategy strategy){

this.strategy = strategy;

}

publicvoid contextInterface(){

strategy.algorithmlnterface();

}

}

3、算法a

publicclass ConcreteStrategyAextends Strategy
{

@Override

publicvoid algorithmlnterface() {

//TODO Auto-generated method stub

System.out.println("this is algorithm a ;");

}

}

、算法b

publicclass ConcreteStrategyBextends Strategy
{

@Override

publicvoid algorithmlnterface() {

//TODO Auto-generated method stub

System.out.println("this is algorithm b ;");

}

}

、client调用

publicclass StrategyClient {

/**

* @param args

*/

publicstaticvoid main(String[] args) {

//TODO Auto-generated method stub

/*

*
对照与工厂模式,该client只依赖于Context类,解耦更加彻底

*
添加一个算法只须要添加一个算法类就可以

*/

Contextcontext =
new
Context(new ConcreteStrategyA());

context.contextInterface();

//看到了吧。想要B算法就直接实例一下就能够调用它的方法了

Contextcontext2 =
new
Context(new ConcreteStrategyB());

context2.contextInterface();

}

}

总结:策略模式是一种定义一系列算法的方法,从概念上来看,全部这些算法完毕的都是同样的工作,仅仅是实现不同。它能够以同样的方式调用全部的算法,降低了各种算法类与使用算法类之间的耦合。

附上代码地址:http://download.csdn.net/detail/jzhf2012/8084405

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式的更多相关文章

  1. &lt;十二&gt;读&lt;&lt;大话设计模式&gt;&gt;之状态模式

    对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的.状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化.在程 ...

  2. &lt;四&gt;读&lt;&lt;大话设计模式&gt;&gt;之代理模式

    代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种 ...

  3. &lt;五&gt;读《《大话设计模式》》之工厂模式

    怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...

  4. 大话设计模式之PHP篇 - 策略模式

    什么是策略模式? 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 组成:抽象策略角色: 策略类,通常由一个接口或者抽象 ...

  5. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  6. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  7. php设计模式课程---6、策略模式如何使用

    php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...

  8. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  9. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

随机推荐

  1. 剑指offer面试题12-打印1到最大的n位数

    题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...

  2. PHPCMS增加投票选项代码

    <script src="jquery-1.10.1.js"></script> <tr> <th width="20%&quo ...

  3. HDU 1199 &amp;&amp; ZOJ 2301 线段树离散化

    一段长度未知的线段.一种操作:a b c ,表示区间[a,b]涂为颜色C,w代表白色,b代表黑色,问终于的最长连续白色段,输出起始位置和终止位置 离散化处理.和寻常的离散化不同,须要把点化成线段.左闭 ...

  4. Cflow使用具体解释

    近期使用cflow,依据Cflow提供的帮助对cflow的使用方法做了具体的整理.把经常使用的命令的使用方法贴出来.完整版请见http://download.csdn.net/detail/hanch ...

  5. 笔记本样式的EditText控件(每行均带下划虚线)

    package com.zongyi.trip.ui; import com.zongyi.trip.R; import android.annotation.SuppressLint; import ...

  6. oracle 之flashback 深入研究。

    oracle 之flashback 深入研究. 今天是2013-08-24,开始进行oracle flashback 内部原理研究,记录一下笔记. SQL> startup ORACLE ins ...

  7. B/S与C/S的差别

    前一段时间已经结束了C/S的学习,開始了B/S的旅程,那么为什么我们要学习这两个,这两个有什么差别呢?这些差别你知道多少呢? B/S结构.即Browser/Server(浏览器/server)结构.是 ...

  8. 算法笔记_171:历届试题 小朋友排队(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的 ...

  9. 通过修改css文件来观察openerp表单中的col和colspan

    适用版本 openerp 6.1.1 问题的提出 在openerp的表单定义中, 要使用 colspan和col 指你定各个元素的占位, 前者说明了本元素占据其所在容器的列数, 后者说明了本元素作为容 ...

  10. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

    一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...