1. 外观模式
"最少知识原则"
就任何对象而言,在该对象的方法内,我们只应该调用属于以下范围的方法:
.该对象本身
.被当做方法的参数而传递进来的对象
.此方法所创建或实例化的任何对象
.对象的任何组件
外观模式提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。
2. 模板方法
模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。
模板方法 子类决定如何实现算法中的步骤
策略 封装可互换的行为,然后用委托来决定要采用要一个行为
工厂方法 由子类决定实例化哪个具体类
模板方法模式 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变
算法结构的情况下,重新定义算法中的某些步骤。
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
工厂方法是模式方法的特殊版本?
3. 迭代器模式
public class PancakeHouseIterator implements Iterator{
ArrayList menuItems;
int position = 0;
public PancakeHouseIterator(ArrayList menuItems) {
this.menuItems = menuItems;
}
public Object next() {
MenuItem menuItem = menuItems.get(position);
position ++;
return menuItem;
}
public boolean hasNext() {
if (position > menuItems.size()) {
return false;
} else {
return true;
}
}
}
public class PancakeHouseMenu {
ArrayList items;
public Iterator createIterator() {
return new PancakeHouseMenuIterator(items);
}
}
P350
public class AlternatingDinerMenuIterator implements Iterator {
MenuItem[] items;
int position;
public AlternatingDinerMenuIterator(MenuItem[] items) {
this.items = items;
Calendar rightNow = Calendar.getInstance();
positon = rightNow.get(calendar.DAY_OF_WEEK) %2;
}
public Object next() {
MenuItem menuItem = items[positon];
position = position + 2;
return menuItem;
}
public boolean hasNext() {
if (position >= items.length || items[position] == null) {
return false;
} else {
return true;
}
}
public void remove() {
throw new UnsupportedOperationException(
"Alternating Diner Menu Iterator does not support remove()");
}
}
一个类应该是单一责任的,即一个类应该只有一个引起变化的原因
4. 策略 封装可互换的行为,并使用委托决定使用哪一个
适配器 改变一个或多个类的接口
迭代器 提供一个方式来遍历集合,而无须显露集合的实现
外观 简化一群类的接口
组合 客户可以将对象的集合以及个别的对象一视同仁
观察者 当某个状态改变时,允许一群对象能被通知到
组合模式允许你将对象组成树形结构来表现“整体、部分”的层次结构。
组合能让客户以一致的方式处理个别对象和对象组合。