您的位置:首页 > 其它

设计模式笔记--策略模式

2013-04-05 20:47 399 查看

一:前言

     清明无意中翻出一位老师介绍我看的设计模式电子书,没想到已经参加工作十个月了,因为在学校的时候主要做的是底层网络通信,没有使用过java,

当然现在科班出身的本科生都要学java的吧,记得当时自己觉得学习java没用,几乎堂堂翘课,跑去图书馆看史蒂文的《TCP/IP详解》系列、《unix高级环境编程》等底层网络通信的书籍,考试前一天看了下教材,就考试去了,成绩还不错。找工作的时候也是通过底层网络的技术获得目前公司的offer,然而阴差阳错的我被安排到了java研发岗位上,当然抵触肯定会有的,相信有相同经历的朋友会有同感。好吧,公司的那句话说的很棒,“永远不变的是变化”,几乎从零开始学习java,从C转换为java开发,其中有很多东西要学习,问了很多小白的问题,你懂的,我不懂啊,小白就小白吧,一时小白被人鄙视总比不懂装懂强,幸好有师傅铁大师带,从零开始教我,非常感谢他,是他把我领进了门。在研究团队项目的时候,发现有很多地方设计的相当巧妙,扩展性相当好,今天看到cbf4life著作的《设计模式》书籍时有种醍醐灌顶的感觉,原来这些都是设计模式,java开发框架的精华。

二:strategy
pattern 

        水杯就是一个strategy pattern,一个水杯可以用来装白开水、牛奶、beer等,对外只提供drink服务,它自己并不关心里面装是什么,它只是一个容器。

先定义一个接口water:

package com.netboy.demo;
/**
* @功能:  水的接口
* @版本号:
* @作者:  netboy  Email:wang_lin_n@163.com
* @时间:  2013-4-5  下午08:17:27
* @例子:
*/
public interface Water {

public void taste();

}


子类白开水:

package com.netboy.demo;

/**
* @功能:
* @版本号:
* @作者: netboy Email:wang_lin_n@163.com
* @时间: 2013-4-5 下午08:20:17
* @例子:
*/
public class GoodWater implements Water {
@Override
public void taste() {
System.out.println("白开水,是最健康的。");
}
}


子类牛奶:

package com.netboy.demo;
/**
* @功能:
* @版本号:
* @作者:  netboy  Email:wang_lin_n@163.com
* @时间:  2013-4-5  下午08:21:50
* @例子:
*/
public class MilkWater implements Water {
@Override
public void taste() {
System.out.println("牛奶,富含营养");
}
}


子类beer:

package com.netboy.demo;
/**
* @功能: 啤酒类
* @版本号:
* @作者:  netboy  Email:wang_lin_n@163.com
* @时间:  2013-4-5  下午08:23:03
* @例子:
*/
public class BeerWater implements Water {
@Override
public void taste() {
System.out.println("啤酒,适量为佳");
}
}

水杯类,用来为人提供服务:

package com.netboy.demo;

import java.util.ArrayList;
import java.util.List;
/**
* @功能: 水杯,用来承装饮料,提供服务
* @版本号:
* @作者:  netboy  Email:wang_lin_n@163.com
* @时间:  2013-4-5  下午08:24:44
* @例子:
*/
public class Cup {
private  List<Water> waterList = new ArrayList<Water>();

public void service() {
if(waterList.size() <= 0) {
System.out.println("sorry,the cup is empty");
return;
}
for(Water water : waterList) {
water.taste();
}
}
public void  add(Water water) {
this.waterList.add(water);
}
}


定义一个人,去实现饮料和水杯的价值:

package com.netboy.demo;
/**
* @功能:
* @版本号:
* @作者:  netboy  Email:wang_lin_n@163.com
* @时间:  2013-4-5  下午08:16:20
* @例子:
*/
public class Man {
public static void main(String[] args) {
System.out.println("hello,this is strategy pattern");
Water milk = new MilkWater();
Water beer = new BeerWater();
Water whiteWater = new GoodWater();
Cup cup = new Cup();
//向容器中添加白开水
cup.add(whiteWater);
cup.service();
//添加其它饮料
cup.add(beer);
cup.add(milk);
cup.service();
}
}

运行如下:

*******************************************************************************************



*******************************************************************************************

        对于水杯来说,里面装的是什么,它并不关心,它只是为调用它的类提供service()服务,这样很方便进行扩展,如果饮料类型变化,我们只需要定义一个新类实现water接口,然后可以通过spring将其注入到cup类的waterList中,那么waterlist中的所有water子类的taste()方法都会被调用。

上面的杯子类有点小bug,应该添加上清空方法:

public class Cup {
private List<Water> waterList = new ArrayList<Water>();

public void service() {
if(waterList.size() <= 0) {
System.out.println("sorry,the cup is empty");
return;
}
for(Water water : waterList) {
water.taste();
}
}
public void add(Water water) {
this.waterList.add(water);
}
/**
* 清空杯子
*/
public void clearCup() {
waterList.clear();
System.out.println("杯子已经清空了");
}
}

执行类:
public class Man {
public static void main(String[] args) {
System.out.println("hello,this is strategy pattern");
Water milk = new MilkWater();
Water beer = new BeerWater();
Water whiteWater = new GoodWater();
Cup cup = new Cup();
//向容器中添加白开水
cup.add(whiteWater);
cup.service();
//添加其它饮料
cup.add(beer);
cup.add(milk);
cup.service();

//clear the cup
cup.clearCup();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: