第四章 模式设计
目录
装饰模式\r迭代器模式\r组合模式
装饰模式
迭代器模式
/** \r 定义一个接口,所有的项目都是一个接口 \r */ \rpublic interface IProject { \r //从老板这里看到的就是项目信息 \r public String getProjectInfo(); \r} \r \r定义了一个接口,面向接口编程嘛,当然要定义接口了,然后看看实现类: \r \r/** \r 所有项目的信息类 \r */ \rpublic class Project implements IProject { \r //项目名称 \r private String name = ""; \r //项目成员数量 \r private int num = 0;
//项目费用 \rprivate int cost = 0; \r \r//定义一个构造函数,把所有老板需要看到的信息存储起来 \rpublic Project(String name,int num,int cost){ \r //赋值到类的成员变量中 \r this.name = name; \r this.num = num; \r this.cost=cost; \r } \r \r//得到项目的信息 \rpublic String getProjectInfo() { \r String info = ""; \r \r //获得项目的名称 \r info = info "项目名称是:" this.name; \r //获得项目人数 \r info = info "\t项目人数: " this.num; \r //项目费用 \r info = info "\t 项目费用:" this.cost; \r \r return info; \r}\r}
import java.util.ArrayList; \r \r/** \r * 老板来看项目信息了 \r */ \rpublic class Boss { \r \r public static void main(String[] args) { \r //定义一个List,存放所有的项目对象 \r ArrayList
\r //增加星球大战项目 \r projectList.add(new Project("星球大战项目",10,100000)); \r //增加扭转时空项目 \r projectList.add(new Project("扭转时空项目\r",100,10000000)); \r //增加超人改造项目 \r projectList.add(new Project("超人改造项目\r",10000,1000000000)); \r \r //这边100个项目 \r for(int i=4;i<104;i ){ \r projectList.add(new Project("第" i "个项目\r",i*5,i*1000000)); \r } \r \r //遍历一下ArrayList,把所有的数据都取出 \r for(IProject project:projectList){ \r System.out.println(project.getProjectInfo()); \r } \r }\r}
项目名称是:星球大战项目 项目人数: 10 项目费用:100000 \r项目名称是:扭转时空项目 项目人数: 100 项目费用:10000000 \r项目名称是:超人改造项目 项目人数: 10000 项目费用:1000000000 \r项目名称是:第4个项目 项目人数: 20 项目费用:4000000 \r项目名称是:第5个项目 项目人数: 25 项目费用:5000000 \r. \r. \r.
public interface IProject { \r \r //增加项目 \r public void add(String name,int num,int cost); \r \r //从老板这里看到的就是项目信息 \r public String getProjectInfo(); \r \r //获得一个可以被遍历的对象 \r public IProjectIterator iterator(); \r}
import java.util.ArrayList; \r \r/** \r* 所有项目的信息类 \r */ \r@SuppressWarnings("all") \rpublic class Project implements IProject { \r //定义一个项目列表,说有的项目都放在这里 \r private ArrayList
public Project(){ \r \r } \r \r//定义一个构造函数,把所有老板需要看到的信息存储起来 \rprivate Project(String name,int num,int cost){ \r //赋值到类的成员变量中 \r this.name = name; \r this.num = num; \r this.cost=cost; \r } \r \r//增加项目 \rpublic void add(String name,int num,int cost){ \r this.projectList.add(new Project(name,num,cost)); \r } \r \r//得到项目的信息 \rpublic String getProjectInfo() { \r String info = "";
//获得项目的名称 \r info = info "项目名称是:" this.name; \r //获得项目人数 \r info = info "\t项目人数: " this.num; \r //项目费用 \r info = info "\t 项目费用:" this.cost; \r \r return info; \r } \r \r //产生一个遍历对象 \r public IProjectIterator iterator(){ \r return new ProjectIterator(this.projectList); \r } \r \r} \r
项目信息类已经产生,我们再来看看我们的迭代器是如何实现的,先看接口
import java.util.Iterator; \r \r/** \r * @author cbf4Life cbf4life@126.com \r * I|acute;m glad to share my knowledge with you all. \r * 定义个Iterator接口 \r */ \r@SuppressWarnings("all") \rpublic interface IProjectIterator extends Iterator { \r \r} \r
定义的这个接口方法、变量都没有,有什么意义呢?\r有意义,所有的Java 书上都一直说是面向接口编程,你的接口是对一个事物的描述,也就是说我通过接口就知道这个事物有哪些方法,哪些属性,我们这里的 IProjectIterator 是要建立一个指向Project 类的迭代器,目前暂时定义的就是一个通用的迭代器,可能以后会增加IProjectIterator 的一些属性或者方法。当然了,你也可以在实现类上实现两个接口,一个是 Iterator,一个是 IProjectIterator(这时候,这个接口就不用继承 Iterator).\r 我要实现一个容器或者其他 API 提供接口时,我一般都自己先写一个接口继承,然后再继承自己写的接口,保证自己的实现类只用实现自己写的接口(接口传递,当然也要实现顶层的接口),程序阅读也清晰一些。
定义一个迭代器
public class ProjectIterator implements IProjectIterator { \r \r //所有的项目都放在这里ArrayList中 \r private ArrayList
private int currentItem = 0; \r \r//构造函数传入projectList \rpublic ProjectIterator(ArrayList
//删除一个对象 \r public void remove() { \r //暂时没有使用到 \r } \r \r} \r
Boss看信息
public class Boss { \r \r public static void main(String[] args) {\r//定义一个List,存放所有的项目对象 \r IProject project = new Project(); \r \r //增加星球大战项目 \r project.add("星球大战项目ddddd",10,100000); \r //增加扭转时空项目 \r project.add("扭转时空项目",100,10000000); \r //增加超人改造项目 \r project.add("超人改造项目",10000,1000000000); \r \r //这边100个项目 \r for(int i=4;i<104;i ){ \r project.add("第" i "个项目",i*5,i*1000000); \r } \r \r //遍历一下ArrayList,把所有的数据都取出 \r IProjectIterator projectIterator = project.iterator(); \r while(projectIterator.hasNext()){
IProject p = (IProject)projectIterator.next(); \r System.out.println(p.getProjectInfo()); \r \r } \r \r } \r}
运行结果
项目名称是:星球大战项目 项目人数: 10 项目费用:100000 \r项目名称是:扭转时空项目 项目人数: 100 项目费用:10000000 \r项目名称是:超人改造项目 项目人数: 10000 项目费用:1000000000 \r项目名称是:第4个项目 项目人数: 20 项目费用:4000000 \r项目名称是:第5个项目 项目人数: 25 项目费用:5000000 \r. \r. \r.
说明
23 个设计模式是为了简化我们代码和设计的复杂度、耦合程度,为什么我们用了这个迭代器模式程序会复杂了一些呢?这是为什么?因为从 JDK 1.2 版本开始增加java.util.Iterator这个接口,并逐步把Iterator应用到各个聚集类(Collection)中,我们来看 JDK 1.5 的 API 帮助文件,你会看到有一个叫 java.util.Iterable 的接口,看看有多少个接口继承了它:
java.util.Iterable 接口只有一个方法:iterator(),也就说通过 iterator()这个方法去遍历聚集类中的所有方法或属性,基本上现在所有的高级的语言都有 Iterator 这个接口或者实现,Java 已经把迭代器给我们准备了,我们再去写迭代器,是不是“六指儿抓痒,多一道子”?所以呀,这个迭代器模式也有点没落了,基本上很少有项目再独立写迭代器了,\r 直接使用 List 或者 Map 就可以完整的解决问题。
组合模式
\r超市管理系统\r\r物流管理系统