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

:前言

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













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值