- 浏览: 59195 次
- 性别:
- 来自: 厦门
最新评论
-
jason61719:
nice,解决了。感谢
viplugin2.x eclipes的vi 破解
文章列表
先说一下题外话,这个模式是我学的最累的模式,代码纠结无比,而且似乎又不经常用,但是我还是硬着头皮把这个模式给看完了。废话不多说,开始干活.......
意图:允许你将对象组成属性结构来表现“整体/部分”的层次结构,组合能让客户以一直的方式处理个别的对象和对象组合。
结构:
首先是组合包含组件,组件有两种:组合与叶节点元素。
接着我们继续看例子:
在原有的对象餐厅我们添加了晚餐-咖啡餐厅,而咖啡餐厅却有甜点子菜单,这样原有的迭代器模式就不能顺利解决问题了,我们要使用组合与迭代模式的联合:
首先我们来看组合模式该如何进行:
在看具体的代码,从接口MenuCompone ...
意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表现。
结构:
让我们看一下一个例子:
对乡村的餐厅和对象村的煎饼屋合并了。现在碰到一个棘手的问题,餐厅的菜单是使用Arraylist来实现,而煎饼屋的菜单是用数组来进行实现的,由于各自的菜单已经与其他过多的代码进行耦合,所以不能进行更改,现在有一个女Waitress,需要打印全部菜单,我们最初设想就是去分别遍历各自的菜单,但是如果添加以后我们需要第三种遍历方式。。
我们来看这样的缺点:
1.重复代码过多,都是过多的循环遍历,虽然每种遍历方式不同。
2.将菜单的实现暴露在外,耦合过高。
现在 ...
意图:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
结构:
其中AbstractClass 实现为:
public abstract class AbstractClass {
final void templateMethod(){
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();//钩子
}
abstract void primitiveOpe ...
意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构:
例子:
假设你有一套杀手级的家庭影院系统,内含DVD播放器、投影仪、自动屏幕、环绕立体声等。那么当你想看一部DVD时,需要做哪些事情呢(用最土的方式)?
1、将灯光调暗;
2、放下屏幕;
3、打开投影仪;
4、将投影仪的输入切换到DVD;
5、将投影仪设置成宽屏模式;
6、打开功放;
7、将功放的输入设置为DVD;
8、将功放设置为环绕立体声;
9、将功放音量调到中;
10、打开DVD播放器;
11、开始播放DVD。
我想如果每 ...
软件开发中经常遇到的问题:假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商所设计出来的接口,不同于旧厂商的接口。如果你不想改变现有的代码,也不能改变厂商的代码,那么你该如何解 ...
背景:有时候我们需要对方法进行封装,通过对这些封装的方法进行调用,我们可以很好的处理一些事情。比如,记录日志,或者重复使用这些封装实现撤销功能。
意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
结构:
例子:这次我们将设计一个家电自动化遥控器的API
需求分析:
遥控器的图:
1)、遥控器上具有七个可编程的插槽、七个开关按钮和一个整体撤销按钮。
2)、通过创建一组API,使插槽可以控制一个或一组家电装置,这些装置指电灯、电风扇、热水器等。
3)、插槽还可以控制未来可能出现的家电装置。
4)、整体撤 ...
背景:有一些对象其实我们只需要一个,比方说:线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表(registry)的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。因此,我们设计这种类时必须确保只有一个实例,单件模式应运而生。
单件模式的意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
结构:
如何实现:
其实我们只需要把构造函数私有化,把new对象的过程进行控制就行了,具体代码如下:
public c ...
意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
结构:
实例:还是以Pizza店为例,现在pizza需要进行需要不同的原料,例如添加cheese,sauce等原料,重新扩展的pizza为:
package headfirst.factory.pizzaaf;
public abstract class Pizza {
String name;
Dough dough;
Sauce sauce;
Veggies veggies[];
Cheese cheese;
Pepperoni pepperoni;
Clams ...
意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
结构:
实例:下面我们以Pizza店的例子来谈谈“工厂方法模式”的来龙去脉,我们学习的思路是“原始设计-->简单工厂-->工厂方法”。
情景分析:假如你有一个Pizza店,那么你的Pizza订单可能会写成如下代码(这段代码写在PizzaStore类里面):
1public Pizza OrderPizza() 2 { 3 Pizza pizza = new Pizza();
意图:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
结构:
例子:
下面我们以星巴兹(Starbuzz)的订单系统为例加以说明。
需求分析:
1)、星巴兹的饮料(Beverage)种类繁多 ...
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
结构:
例子:
下面以模拟气象站系统来加以说明。
需求分析:
该系统的需求如下:
1、气象站能够追踪目前的天气状况,包括温度、湿度、气压、
2、气象站能够提供三种布告板,分别显示目前天气状况、气象统计和简单的预报。
3、布告板上的数据必须实时更新。
4、气象站必须提供一组API,供其他开发人员开发其他的布告板。
设计部分:
基于以上需求,该系统可以设计成3部分:气象站(获取实际气象数据的物理装置)、WeatherData对象(追踪来自气象站的数据,并更新布 ...
先对策略模式有一个总体认识。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
结构:
下面通过鸭子模拟器的设计来具体介绍。
公司需要设计一套鸭子模拟器系统,该系统的第一次需求为:鸭子能够戏水;鸭子能够呱呱叫。根据该需求系统设计如下:
这个设计主要用了父类鸭子和子类绿头鸭、红头鸭,这样设计的目的是为了达到代码的复用。
过了一段时间,公司希望该系统能够满足新的需求:有些鸭子会飞。因此该系统需要进行修改,修改后的系统可能如下:
该系统在父类中加了“fly()”方法(在父类中加该方法是为了实现代码的复用)。 ...
Linux&find命令
- 博客分类:
- Linux基本知识
1、find命令
find命令是一个无处不在命令,是linux中最有用的命令之一。find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。下面就通过实例来体验下find命令的强大。
1.1、find命令的一般形式
man文档中给出的find命令的一般形式为:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
其实[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个选项并不常用(至少在我的日常工作中,没有 ...
Linux&grep命令
- 博客分类:
- Linux基本知识
grep命令
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
1.1、grep命令的一般选项及实例
grep [OPTIONS] P ...