- 浏览: 64770 次
- 性别:
- 来自: 北京
文章分类
最新评论
1. UML介绍
1.1 类图
类名:正体字,如果是斜体,表示抽象类
属性:public(+),private(-),protected(#)
方法:public(+),private(-),protected(#),静态方法(_)
性质:即一个全局变量,具有get/set方法
1.2 类图关系
一般化(Generalization): 类之间的继承,接口之间的继承,类对接口的实现
关联(Association): 类之间的连接,使一个类知道另一个类的方法或属性,分为单向和双向
0..1: 零个或一个实例
0..*: 对实例无限制
1: 只有一个实例
1..*: 至少一个实例
聚合(Aggregation): 整体和个体的关系,如汽车和引擎
合成(Composition): 整体和个体,但是不能分割,如孙悟空和他的四肢
依赖(Dependency): 一个类依赖另一个类的定义,如人可以买车和房子,体现为局部变量的传入
2. 设计原则
2.1 开-闭原则(Open-Closed Principle, OCP)
一个软件实体应当对扩展开放,对修改关闭。扩展已有系统,提供新的功能;不修改抽象层,只修改实现层
2.2 里氏代换原则(Liskov Substitution Principle, LSP)
凡是基类使用的地方,对子类一定适用,尽量把相同的特征抽象成抽象类
2.3 依赖倒转原则(Dependency Inversion Principle, DIP)
要依赖于抽象,不要依赖于具体,针对接口编程,不要针对实现编程
List emp = new Vector();
List是抽象,而Vector是实现
2.4 接口隔离原则(Interface Segregation Principle, ISP)
一个类对另一个类的依赖应建立在最小接口之上,对不同功能的方法,应当建立不同的接口类型
2.5 组合/聚合复用原则(Composition/Aggregation Principle, CARP)
尽量使用合成,不要使用继承
"Is-A": 一个类是另一个类的一种,那么可以使用继承
"Has-A": 一个类是另一个类的一种角色,那需要使用组合
2.6 迪米特法则(Law of Demeter, LoD)
不要与陌生人通信,如果需要,则通过朋友来进行
3. 设计模式分类
创建模式,结构模式,行为模式
4. 创建模式 - 分为类创建和对象创建
类创建: 延迟到子类进行创建
对象创建: 把对象的创建过程动态委派给另一个对象
简单工厂模式,工厂方法模式,抽象工厂模式,单例模式,多例模式,建造模式,原始模型模式
5. 简单工厂模式(Simple Factory)
又称为静态工厂方法,由一个工厂类根据传入的参数来决定创建出哪一类产品
涉及到工厂类,抽象产品,具体产品3个角色
//工厂角色 public class Creator { public static Product factory() { return new ConcreteProduct(); } } //抽象产品角色 public interface Product {} //具体产品角色 purlic class ConcreteProduct implements Product { public ConcreteProduct() {} }
6. 工厂方法模式(Factory Method)
将实际创建工作推迟到子类,便于引入新的产品,如果一个产品有很多层次,那么同样需要相同层次的工厂类
//抽象工厂角色 public interface Creator { public Product factory(); } //具体工厂1 public class ConcreteCreator1 implements Creator { public Product factory() { return new ConcreteProduct1(); } } //具体工厂2 public class ConcreteCreator2 implements Creator { public Product factory() { return new ConcreteProduct2(); } } //抽象产品角色 public interface Product {} //具体产品1 purlic class ConcreteProduct1 implements Product { public ConcreteProduct1() {//do something} } //具体产品2 purlic class ConcreteProduct2 implements Product { public ConcreteProduct2() {//do something} }
7. 抽象工厂模式(Abstract Factory)
如果多个产品有很多层次,那么抽象工厂模式就将被应用。用于处理不同产品族但具有相同产品层次的情况,
可以使用一个抽象工厂中多个具体工厂角色来负责不同的产品类型
//抽象工厂角色 public interface Creator { public ProductA factoryA() //产品等级结构A的工厂方法 public ProductB factoryB() //产品等级结构B的工厂方法 } //具体工厂1 public class ConcreteCreator1 implements Creator { public ProductA factoryA() { return new ProductA1(); } public ProductA factoryB() { return new ProductB1(); } } //具体工厂2 public class ConcreteCreator2 implements Creator { public ProductA factoryA() { return new ProductA2(); } public ProductA factoryB() { return new ProductB2(); } } //具体产品类ProductA public interface ProductA {} //具体产品类ProductA1 purlic class ProductA1 implements ProductA { public ProductA1() {//do something} } //具体产品类ProductA2 purlic class ProductA2 implements ProductA { public ProductA2() {//do something} } //具体产品类ProductB public interface ProductB {} //具体产品类ProductB1 purlic class ProductB1 implements ProductB { public ProductB1() {//do something} } //具体产品类ProductB2 purlic class ProductB2 implements ProductB { public ProductB2() {//do something} }
8. 单例模式(Singleton)
一个类只有一个实例,一般工具类使用单例模式
//饥饿式单例 public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } } //懒汉式单例 public class LazySingleton { private static LazySingleton instance = null; private LazySingleton() {} public synchronized static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } } //登记式单例-个人以为不适用
9. 多例模式(Multiton)
//有限多实例 public class Die { private static Die die1 = new Die(); private static Die die2 = new Die(); private Die() {} public static Die getInstance(int whichOne) { if (whichOne == 1) { return die1; } else { return die2; } } } //无上限多实例 - 可以返回多实例 键值生成器可以应用单例模式来处理
10. 建造模式(Builder)
零件很多,那么由建造者对客户端进行隐藏,抽象工厂更具体,建造模式更宏观
//Director-负责调用产生对象 public clas Director { private Builder builder; public void construct() { builder = new ConcreteBuilder(); builder.buildPart1(); builder.buildPart2(); builder.retrieveResult(); } } //抽象建造者 public abstract class Builder { public abstract void buildPart1(); public abstract void buildPart2(); public abstract Product retrieveResult(); } //具体建造者 public class ConcreteBuilder extends Builder { private Product product = new Product(); public Product retrieveResult() { return product; } public void buildPart1() { //build the first part of product } public void buildPart2() { //build the first part of product } } //产品 public class Product {}
11. 原始模型模式(Prototype)
指明所要创建对象的类型,然后复制这个原型对象创建更多同类对象
11.1 简单形式 - 原型数量少且固定
//客户端 public class Client { private Prototype prototype; public void operation(Prototype example) { Prototype p = (Prototype)example.clone(); } } //抽象原型 public interface Prototype extends Cloneable { Prototype clone(); } //具体原型 public class ConcretePrototype implments Prototype { public Object clone() { super.clone(); } }
11.2 登记形式 - 原型对象不固定
//抽象原型 public interface Prototype extends Cloneable { Prototype clone(); } //具体原型 public class ConcretePrototype implments Prototype { public synchronized Object clone() { Prototype tmep = null; try { temp = (Prototype)super.clone(); return temp; } catch(CloneNotSupportedException e) { System.out.println("Clone failed."); } finally { return temp; } } } //原型管理器,记录所有原型对象 public class PrototypeManager { private Vector objects = new Vector(); public void add(Prototype object) { objects.add(object); } public Prototype get(int i) { return (Prototype)objects.get(i) } public int getSize() { return objects.size(); } } //客户端 public class Client { private Prototype prototype; private PrototypeManager mgr; public void registerPrototype() { protoypte = new ConcretePrototype(); Prototype p = (Prototype)protoypte.clone(); mgr.add(p); } }
11.3 浅复制和深复制
浅复制: 使用clone,复制引用 Monkey temp = (Monkey)super.clone(); 深复制: 使用Serializable,复制所有对象 //首先将对象写入流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oo.writeObject(this); //然后将对象从流里读出 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return(ois.readObject());
12. 结构模式 - 将类和对象结合在一起形成更大的结构
适配器模式,缺省适配器模式,合成模式,装饰模式,代理模式,享元模式,门面模式,桥梁模式
13. 适配器模式(Adapter)
把一个类的接口变换成客户端可以使用的接口
13.1 类适配器: 适配器和源角色是继承关系
//目标角色 public interface Target { void sampleOperation1(); void sampleOperation2(); } //源角色 public class Adaptee { public void sampleOperation1() {} } //适配器,把原和目标适配起来 public class Adpater extends Adaptee implements Target { //由于Adaptee没有sampleOperation2方法,所以补充上 public void sampleOperation2() {} }
13.2 对象的适配器: 适配器和源角色是委派关系
//目标角色 public interface Target { void sampleOperation1(); void sampleOperation2(); } //源角色 public class Adaptee { public void sampleOperation1() {} } //适配器,把原和目标适配起来 public class Adpater implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } //源方法中有sampleOperation1方法,适配器直接委派即可 public void sampleOperation1() { adaptee.sampleOperation1(); } //由于Adaptee没有sampleOperation2方法,所以补充上 public void sampleOperation2() {} }
14. 缺省适配器(Default Adapter)
一个类需要实现一个接口,但又不想完全实现接口中所有方法,那么可以定义一个抽象类,
让抽象类实现接口方法,然后具体类继承该抽象类,覆盖部分方法即可。
//接口 public interface AbstractService { void serviceOperation1(); int serviceOperation2(); String serviceOperation3(); } //缺省适配类 public class ServicAdapter implements AbstractService { public void serviceOperation1(); public int serviceOperation2() {return 0;} public String serviceOperation3() {return null;} }
15. 合成模式(Composite)
把一个个具体对象和由它们复合而成的合成对象同等看待,如同树叶和树枝组成一个大对象
15.1 安全式合成模式: 管理子类的方法只出现在树枝类,不出现在树叶类
//抽象构件 public interface Component { Composite getComposite(); void sampleOperation(); } //树枝构件 public class Composite implements Component { private Vector componentVector = new java.util.Vector(); public Composite getComposite() {return this;} public void sampleOperation() { Enumeration enum = components(); while(enum.hasMoreElements()) { ((Component)enum.nextElement()).sampleOperation(); } } public void add(Component comp) { componentVector.addElement(comp); } public void remove(Component comp) { componentVector.removeElement(comp); } public Enumeration components { return componentVector.elments(); } } //树叶构件 public class Leaf implements Component { public void sampleOperation() {} public Composite getComposite() {} }
15.2 透明式合成模式: 所有的方法均定义在接口中
//抽象构件 public interface Component { Composite getComposite(); void sampleOperation(); void add(Component comp); void remove(Component comp); Enumeration components(); } //树枝构件 public class Composite implements Component { private Vector componentVector = new java.util.Vector(); public Composite getComposite() {return this;} public void sampleOperation() { Enumeration enum = components(); while(enum.hasMoreElements()) { ((Component)enum.nextElement()).sampleOperation(); } } public void add(Component comp) { componentVector.addElement(comp); } public void remove(Component comp) { componentVector.removeElement(comp); } public Enumeration components { return componentVector.elments(); } } //树叶构件 public class Leaf implements Component { public void sampleOperation() {} public Composite getComposite() {} public void add(Component comp) {} public void remove(Component comp) {} public Enumeration components {} }
16. 装饰(Decorator)
对客户端透明方式扩展对象功能,是继承关系一个替代方案
//抽象构件-规范接收附加责任 public intreface Component { void sampleOperation(); } //具体构件-准备接收附加责任 public class ConcreteComponent implements Component { public ConcreteComponent() {} public void sampleOperation() {} } //装饰角色-持有一个构件实例,并定义一个与抽象构建接口一致的接口 public class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } public void sampleOperation() { component.sampleOperation(); } } //具体装-实现抽象装饰类 public class ConcreteDecorator extends Decorator { public void sampleOperation() { super.sampleOperation(); } }
17. Java I/O中设计模式
String line; //适配器模式 InputStreamReader input = new InputStreamReader(System.in); System.out.println("Enter data and push enter: "); //装饰模式 BufferedReader reader = new BufferedReader(input); line = reader.readLine(); System.out.println("Data entered: " + line);
18. 代理模式(Proxy)
给一个对象提供一个代理对象,由代理对象控制对原对象的引用
可以用于权限检查,调用前后逻辑处理,进行计数,虚拟代理(譬如加载图像慢,给出"加载中..."字样)
//抽象主题 - 所有被使用对象接口 public abstract class Subject { public abstract void request(); } //真实主题 - 具体被使用对象 public class RealSubject extends Subject { public void request() { System.out.println("From real subject."); } } //代理 public class ProxySubject extends Subject { private RealSubject realSubject; public void request() { preRequest(); if (realRequest == null) { realSubject = new RealSubject(); } realSubject.request(); postRequest(); } private void preRequest() {todo} private void postRequest() {todo} } //客户端 Subject subject = new ProxySubject(); subject.request();
19. 享元模式(Flywight)
以共享的方式高效支持大量的细粒度对象
使用条件: 系统有大量对象,对象耗费大量内存,对象状态可以外部化
分为内部状态(可以共享)和外部状态(不可共享)
19.1 单纯享元模式 - 所有的享元对象都是可以共享
//抽象享元角色 - 所有具体享元类的父类 public abstract class Flyweight { public abstract void operation(String state); //参数state是外部状态 } //具体享元角色 public class ConcreteFlyweight extends Flyweight { private Character interState = null; //内部状态 public ConcreteFlyweight(Character state) { this.interState = state; } public void operation(String state) { Syste.out.print("interState = " + interState + ", ExtenState = " + state); } } //享元工厂角色 - 客户端不能直接将具体享元类实例化,所以调用工厂对象 public class FlyweightFactory { private HashMap flies = new HashMap(); private Flyweight flyweight; public Flyweight factory(Character state) { //如果存在,则直接返回 if (flies.containsKey(state)) { return (Flyweight)flise.get(state); } else { Flyweight fly = new ConcreteFlyweight(state); flise.put(state, fly); return fly; } } } //客户端 FlyweightFactory factory = new FlyweightFactory(); Flyweight fly = factory.factory(new Character('a')); fly.operation("First Call"); fly = factory.factory(new Character('b')); fly.operation("Second Call"); fly = factory.factory(new Character('a')); fly.operation("Second Call"); 以上申请了三个享元对象,但实际创建的只有2个
19.2 复合享元模式 - 单纯享元使用合成模式加以复合,复合享元本身不能共享,但可以分解成单纯享元对象
比单纯享元模式多一个复合享元角色
//抽象享元角色 - 所有具体享元类的父类 public abstract class Flyweight { public abstract void operation(String state); //参数state是外部状态 } //具体享元角色 public class ConcreteFlyweight extends Flyweight { private Character interState = null; //内部状态 public ConcreteFlyweight(Character state) { this.interState = state; } public void operation(String state) { Syste.out.print("interState = " + interState + ", ExtenState = " + state); } } //具体复合享元角色 public class ConcreteCompositeFlyweight extends Flyweight { private HashMap flies = new HashMap(10); private Flyweight flyweight; public void add(Character key, Flyweight fly) { flies.put(key, fly); } public void operation(Character extenState) { Flyweight fly = null; for (Iterator it = flies.entrySet().iterator(); it.hasNext();) { Map.Entry e = (Map.Entry)it.next(); fly = (Flyweight)e.getValue(); fly.operation(extenState); } } } //享元工厂角色 - 客户端不能直接将具体享元类实例化,所以调用工厂对象 public class FlyweightFactory { private HashMap flies = new HashMap(); //单纯享元工厂方法,所需状态以参数传入 public Flyweight factory(Character state) { //如果存在,则直接返回 if (flies.containsKey(state)) { return (Flyweight)flise.get(state); } else { Flyweight fly = new ConcreteFlyweight(state); flise.put(state, fly); return fly; } } //复合享元工厂方法 public Flyweight factory(String compositeState) { ConcreteCompositeFlyweight ccf = new ConcreteCompositeFlyweight(); int length = compositeState.length(); Character state = null; for (int i = 0; i < length; i++) { state = new Character(compositeState.charAt(i)); System.out.println("factory(" + state + ")"); ccf.add(state, this.factory(state)); } return ccf; } } //客户端 FlyweightFactory factory = new FlyweightFactory(); Flyweight fly = factory.factory("aba"); fly.operation("Composite Call"); aba三个Character
20. 门面模式(Facade)
外部与一个子系统通信必须通过一个统一的门面对象进行
Session门面: 一个SessionBean,用于提供客户端和EntityBean打交道
21. 桥梁模式(Bridge)
将抽象化和实现化脱耦,脱耦也就是使用组合而不是继承
//抽象化角色 - 给出定义,并保存一个实例化的引用 public abstract class Abstraction { protected Implementor imp; public void operation() { imp.operationImp(); } } //修正抽象化角色 - 扩展抽象化角色,改变和修正父类对抽象化的定义 public class RefinedAbstraction extends Abstraction { public void operation() {//improved logic} } //实现化角色 - 只是实现化接口,不给出具体实现 public abstract class Implementor { public abstract void operationImp(); } //具体实现化角色 public class ConcreteImplementorA extends Implementor { public void operationImp() {//implement it} }
22. 行为模式
不同对象之间划分责任和算法的抽象化
不变模式,策略模式,模板方法模式,观察者模式,迭代模式,责任链模式,命令模式,
备忘录模式,状态模式,访问者模式,解释器模式,调停者模式
23. 不变模式(Immutable)
一个对象的状态在被创建之后就不再变化,譬如java.lang.String
23.1 弱不变模式
一个类的实例不可变化,但给类的子类实例可能会变化
23.2 强不变模式
一个类和子类的实例都不可变,该类所有方法是final
24. 策略模式(Strategy)
又称为Policy模式,针对一组算法,将每一个算法封装到具有共同接口的独立类中,是的它们可以相互替换
比如购物车,不同种类商品打折,计算总价,就应该把计算价格封装到策略类中
//环境(Context)角色 - 持有一个Strategy类的引用 public class Context { private Strategy strategy; //策略方法 public void contextInterface() { strategy.strategyInterface(); } } //抽象策略类 public abstract class Strategy { public abstract void strategyInterface(); } //具体策略 public class ConcreteStrategy extends Strategy { public void strategyInterface() { //implement } }
25. 模板方法模式(Template Method)
准备一个抽象类,实现部分逻辑,然后剩余逻辑由不同子类实现。模板方法中的方法分为模板方法和基本方法
模板方法: 定义在抽象类中
基本方法: 抽象方法(由抽象类声明,具体类实现),具体方法,钩子方法(由抽象类声明并实现,子类会扩展,
通常以do开始,譬如HttpServlet中的doGet()和doPost()方法)
//抽象模板 - 定义多个抽象操作,由子类实现 public abstract class AbstractClass { public void templateMethod() { doOperation1(); //由子类实现 doOperation2(); //由子类实现 doOperation3(); //已经实现 } protected abstract void doOperation1(); //由子类实现 protected abstract void doOperation2(); //由子类实现 private final void doOperation3() {//do something} //已经实现 } //具体模板类 public class ConcreteClass extends AbstractClass { public void doOperation1() { System.out.println("doOperation1()"); } public void doOperation2() { System.out.println("doOperation2()"); } }
26. 观察者模式(Observer)
定义了一对多的依赖关系,多个观察者同时监听一个主题对象。又称为发布-订阅模式(Publish/Subscribe),
模型-视图模式(Model/View),源-监听器(Source/Listener),从属者模式(Dependents)
典型应用: AWT中的Listener应用,SAX2应用,Swing Timer应用
26.1 简单观察者模式 - 使用具体主题来保存观察者对象
//抽象主题 - 把所有观察者对象的引用保存到一个集合对象,被观察者对象 public interface Subject { public void attach(Observer observer); //登记新的观察者对象 public void detach(Observer observer); //删除观察者对象 void notifyObservers(); //通知观察者对象 } //具体主题 - 将有关状态存入具体观察者,在具体主题改变,通知所有观察者 public class ConcreteSubject implements Subject { private Vector observers = new Vector(); public void attach(Observer observer) { observers.addElement(observer); } public void detach(Observer observer) { observers.removeElement(observer); } void notifyObservers() { Enumeration enum = observers(); while (enum.hasMoreElements()) { ((Observer)enum.nextElement()).update(); } } public Enumeration observers() { return ((Vector)observers.clone()).elements(); } } //抽象观察者 public interface Observer { void update(); } //具体观察者 public class ConcreteObserver implements Observer { public void update() { System.out.println("I am notified."); } }
26.2 第二种模式 - 使用抽象主题来保存观察者对象
//抽象主题 - 把所有观察者对象的引用保存到一个集合对象,被观察者对象 public abstract class Subject { private Vector observers = new Vector(); public void attach(Observer observer) { observers.addElement(observer); } public void detach(Observer observer) { observers.removeElement(observer); } void notifyObservers() { Enumeration enum = observers(); while (enum.hasMoreElements()) { ((Observer)enum.nextElement()).update(); } } public Enumeration observers() { return ((Vector)observers.clone()).elements(); } } //具体主题 public class ConcreteSubject extends Subject { private String state; public void change(String newState) { state = newState; this.notifyObservers(); } } //客户端 private static ConcreteSubject subject; private static Observer observer; subject = new ConcreteSubject(); observer = new ConcreteObserver(); subject.attach(observer); subject.change("new state");
27. 迭代模式(Iterator)
可以顺序的访问一个集合中的元素而不必暴露集合的内部表象,又称为游标模式(Cursor)
宽接口: 提供了修改聚集元素的方法的接口
百箱聚集: 提供宽接口的聚集
外部迭代: 宽接口,可以从外部控制
窄接口: 没有提供修改聚集元素的方法的接口
黑箱聚集: 同时提供聚集对象的封装和迭代功能的实现的聚集
内部迭代: 迭代是聚集的内部类
27.1 白箱聚集和外部迭代
//抽象聚集 - 给出创建迭代对象的接口 public abstract clas Aggregate { public Iterator createIterator() { return null; } } //抽象迭代 - 定义遍历元素所需接口 public interface Iterator { void first(); void next(); boolean isDone(); Object currentItem(); } //具体聚集角色 public class ConcreteAggregate extends Aggregate { private Object[] objs = {"Monk Tang", "Monkey", "Pigsy", "Sandy", "Horse"}; public Iterator createIterator() { return new ConcreteIterator(this); } public Object getElement(int index) { if (index < objs.length) { return objs[index]; } else { return null; } } public int size() { return objs.length; } } //具体迭代 public class ConcreteIterator implements Iterator { private ConcreteAggregate agg; private int index = 0; private int size = 0; public ConcreteIterator(ConcreteAggregate agg) { this.agg = agg; size = agg.size(); index = 0; } public void first() { index = 0; } public void next() { if (index < size) { index++; } } public boolean isDone() { return (index >= size); //是否最后一个元素 } public Object currentItem() { return agg.getElement(index); } } //客户端 public class Client { private Iterator it; private Aggregate agg = new ConcreteAggregate(); public void operation() { it = agg.createIterator(); while (!it.isDone()) { System.out.println(it.currentItem().toString()); it.next(); } } public static void main(String[] args) { Client client = new Client(); client.operation(); } }
27.2 黑箱聚集和内部迭代
//抽象聚集 - 给出创建迭代对象的接口 public abstract clas Aggregate { public Iterator createIterator(); } //抽象迭代 - 定义遍历元素所需接口 public interface Iterator { void first(); void next(); boolean isDone(); Object currentItem(); } //具体聚集角色 public class ConcreteAggregate extends Aggregate { private Object[] objs = {"Monk Tang", "Monkey", "Pigsy", "Sandy", "Horse"}; public Iterator createIterator() { return new ConcreteIterator(this); } //内部成员类:具体迭代子类 private class ConcreteIterator implements Iterator { private int currentIndex = 0; public void first() { currentIndex = 0; } public void next() { if (currentIndex < objs.length) { currentIndex++; } } public boolean isDone() { return (currentIndex == objs.length); //是否最后一个元素 } public Object currentItem() { return objs(currentIndex); } } } //客户端 public class Client { private Iterator it; private Aggregate agg = new ConcreteAggregate(); public void operation() { it = agg.createIterator(); while (!it.isDone()) { System.out.println(it.currentItem().toString()); it.next(); } } public static void main(String[] args) { Client client = new Client(); client.operation(); } }
28. 责任链模式(Chain of Responsibility)
很多对象组成一条链,而请求由链上某个对象来决定处理
//抽象处理者 - 定义处理请求的接口或方法,以设定和返回对下家的引用 public abstract class Handler { protected Handler handler; public abstract void handleRequest(); //调用该方法处理请求 public void setHandler(Handler handler) { //调用该方法设定下家 this.handler = handler; } public Handler getHandler() { //调用该方法取值 return handler; } } //具体处理者 - 可以处理或者传递给下家 public class ConcreteHandler extends Handler { public void handleRequest() { if (getHandler() != null) { System.out.println("The request is passed to " + getHandler()); getHandler().handleRequest(); } else { System.out.println("Thre request is handled here."); } } } //客户端 private static Handler handler1, handler2; handler1 = new ConcreteHandler(); handler2 = new ConcreteHandler(); handler1.setHandler(handler2); handler1.handleRequest();
29. 命令模式(Command)
命令模式把发出命令的责任和执行命令的责任分开,委派给不同对象。
命令模式,可以没有接收者,具体命令类中实现执行细节
执行顺序:
1. Client创建具体命令对象,指明接收者
2. 请求者保存具体命令对象
3. 请求者调用action发出请求
4. 具体命令对象调用接收者来执行命令
//客户角色 - 创建一个具体命令并确定其接收者 Receiver receiver = new Receiver(); Command cmd = new ConcreteCommand(receiver); Invoker invoker = new Invoker(cmd); invoker.action(); //请求者 - 负责调用命令对象执行请求,相关的方法叫行动方法 public class Invoker { private Command cmd; public Invoker(Command cmd) { this.cmd = cmd; } public void action() { cmd.execute(); } } //接收者 - 负责具体执行一个请求 public class Receiver { public Receiver() {//do something} public void action() { System.out.println("Action has been taken."); } } //抽象命令 public interface Command { void execute(); } //具体命令 - 实现execute方法,负责调用接收者相应操作 public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } public void execute() { receiver.action(); } }
30. 备忘录模式(Memento)
又名快照模式(Snapshot)或Token模式。
用来存储另一个对象内部状态的快照,在不破坏封装的条件下,讲一个对象捕捉住,并外部化存储起来,
在合适时间把该对象还原到原始状态,可以存储多个状态,也称检查点(check point)
备忘录角色:
1. 将发起人(Originator)对象的内部状态存储起来
2. 窄接口: 负责人(Caretaker)看到窄接口,只允许吧备忘录对象传给其他对象
3. 宽接口: 允许发起人读取所有数据
发起人(Originator)角色: 创建一个含有当前内部状态的备忘录对象,使用备忘录存储其内部状态
负责人(Caretaker)角色:负责保存备忘录对象,不检查备忘录对象的内容
30.1 白箱实现
//发起人 public class Originator { private String state; //工厂方法,返回一个新的备忘录对象 public Memento createMemento() { return new Memento(state); } //将发起人恢复到备忘录对象所记载的状态 public void restoreMemento(Memento memento) { this.state = memento.getState(); } public String getState() { return this.state; } public void setState(String state) { this.state = state; System.out.println("Current state = " + this.state); } } //备忘录 public class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return this.state; } public void setState(String state) { this.state = state; } } //负责人 public class Caretaker { private Memento memento; public Memento retrieveMemento() { return this.memento; } public void saveMemento(Memento memento) { this.memento = memento; } } //客户端 private static Originator o = new Originator(); private static Caretaker c = new Caretaker(); o.setState("On"); //设置发起人对象状态 c.saveMemento(o.createMemento); //创建备忘录,存储发起人对象状态 o.setState("Off"); //修改发起人对象状态 o.restoreMemento(c.retrieveMemento()); //恢复发起人对象状态
30.2 黑箱实现 - 把Memento设计成Originator的内部类
//发起人 public class Originator { private String state; //工厂方法,返回一个新的备忘录对象 public Memento createMemento() { return new Memento(state); } //将发起人恢复到备忘录对象所记载的状态 public void restoreMemento(MementoIF memento) { Memento aMemento = (Memento)memento; this.setState(aMemento.getState()); } public String getState() { return this.state; } public void setState(String state) { this.state = state; System.out.println("Current state = " + this.state); } protected class Memento implements MementoIF { private String savedState; private Memento(String someState) { savedState = someState; } public String getState() { return savedState; } public void setState(String someState) { savedState = someState; } } } //备忘录标识接口 public interface MementoIF {} //负责人 public class Caretaker { private MementoIF memento; public MementoIF retrieveMemento() { return this.memento; } public void saveMemento(MementoIF memento) { this.memento = memento; } } //客户端 private static Originator o = new Originator(); private static Caretaker c = new Caretaker(); o.setState("On"); //设置发起人对象状态 c.saveMemento(o.createMemento); //创建备忘录,存储发起人对象状态 o.setState("Off"); //修改发起人对象状态 o.restoreMemento(c.retrieveMemento()); //恢复发起人对象状态
31. 状态模式(State)
允许一个对象在其内部状态改变的时候改变其行为
//环境类 - 定义客户端定制接口,保留一个具体状态类实例,把行为委派给抽象状态 public class Context { private State state; public void sampleOperation() { state.sampleOperation(); } public void setState(State state) { this.state = state; } } //抽象状态 public interface State { void sampleOperation(); } //具体状态 public class ConcreteState implements State { public void sampleOperation() {//do something} }
32. 访问者模式(Visitor)
封装一些施加于某种数据结构元素之上的操作。聚集中有一群对象,那么每个对象方法中会相互持有对方
如果有一堆
if (o instanceof Collection) {
} else if (o instanceof String){
}
......
那么访问者模式就派上用场
//抽象访问者 - 声明一个或多个访问操作 public interface Visitor { void visit(NodeA node); //对NodeA的访问操作 void visit(NodeB node); //对NodeB的访问操作 } //具体访问者VisitorA public class VisitorA implements Visitor { public void visit(NodeA nodeA) { System.out.println(nodeA.operationA()); } public void visit(NodeB nodeB) { System.out.println(nodeB.operationB()); } } //具体访问者VisitorB public class VisitorB implements Visitor { public void visit(NodeA nodeA) { System.out.println(nodeA.operationA()); } public void visit(NodeB nodeB) { System.out.println(nodeB.operationB()); } } //抽象节点 - 声明一个接受操作 public abstract class Node { public abstract void accept(Visitor visitor); } //具体节点A public class NodeA extends Node { public void accept(Visitor visitor) { visitor.visit(this); } public String operationA() { return "NodeA is visited."; } } //具体节点B public class NodeB extends Node { public void accept(Visitor visitor) { visitor.visit(this); } public String operationB() { return "NodeB is visited."; } } //结构对象 - 持有聚集,向外提供add()方法作为聚集的管理操作 public class ObjectStructure { private Vector nodes; private Node node; public ObjectStructure() { nodes = new Vector(); } public void action(Visitor visitor) { for (Enumeration e = nodes.elements(); e.hasMoreElements();) { node = (Node)e.nextElement(); node.accept(visitor); } } public void add(Node node) { nodes.addElement(node); } } //客户端 private static ObjectStructure objects; private static Visitor visitor; objects = new ObjectStructure(); objects.add(new NodeA()); objects.add(new NodeB()); visitor = new VisitorA(); objects.action(visitor);
33. 解释器模式(Interpreter)
把一种语言按照文法翻译成另一种表示,比如匹配模式搜寻字符串
对布尔表达式进行操作和求值示例:
//抽象表达式 - 声明所有具体表达式角色都要实现的接口,其中主要是interpret()方法 //AND OR NOT Variable Constant一系列操作 public abstract class Expression { public abstract boolean interpret(Context ctx); public abstract boolean equals(Object o); public abstract int hashCode(); public abstract String toString(); } //Constant代表一个布尔常量 public class Constant extends Expression { private boolean value; public Constant(boolean value) { this.value = value; } public boolean interpret(Context ctx) { return value; } public boolean equals(Object o) { if (o != null && o instanceof Constant) { return this.value == ((Constant)o).value; } return false; } public int hashCode() { return (this.toString()).hashCode(); } public String toString() { return new Boolean(value).toString(); } } //Variable代表一个有名变量 public class Variable extends Expression { private String name; public Variable(String name) { this.name = name; } public boolean interpret(Context ctx) { return ctx.lookup(this); } public boolean equals(Object o) { if (o != null && o instanceof Variable) { return this.name.equals((Variable)o).name; } return false; } public int hashCode() { return (this.toString()).hashCode(); } public String toString() { return name; } } //And类 public class And extends Expression { private Expression left, right; public And(Expression left, Expression right) { this.left = left; this.right = right; } public boolean interpret(Context ctx) { return (left.interpret(ctx) && right.interpret(ctx)); } public boolean equals(Object o) { if (o != null && o instanceof And) { return (this.left.equals((And)o).left && this.right.equals((And)o).right); } return false; } public int hashCode() { return (this.toString()).hashCode(); } public String toString() { return "(" + left.toString() + " AND " + right.toString() + ")"; } } //OR类 public class Or extends Expression { private Expression left, right; public Or(Expression left, Expression right) { this.left = left; this.right = right; } public boolean interpret(Context ctx) { return (left.interpret(ctx) && right.interpret(ctx)); } public boolean equals(Object o) { if (o != null && o instanceof Or) { return (this.left.equals((Or)o).left && this.right.equals((Or)o).right); } return false; } public int hashCode() { return (this.toString()).hashCode(); } public String toString() { return "(" + left.toString() + " Or " + right.toString() + ")"; } } //NOT类 public class Not extends Expression { private Expression exp; public Not(Expression exp) { this.exp = exp; } public boolean interpret(Context ctx) { return !exp.interpret(ctx); } public boolean equals(Object o) { if (o != null && o instanceof Not) { return this.exp.equals((Not)o).exp; } return false; } public int hashCode() { return (this.toString()).hashCode(); } public String toString() { return "(" + exp.toString() + ")"; } } //Context类 - 定义出从变量到布尔值的一个映射 public class Context { private HashMap map = new HashMap(); public void assign(Variable var, boolean value) { map.put(var, new Boolean(value)); } public boolean lookup(Variable var) throws IllegalArgumentException { Boolean value = (Boolean)map.get(var); if (value == null) { throw new IllegalArgumentException(); } return value.booleanValue(); } } //Client private static Context ctx; private static Expression exp; ctx = new Context(); Variable x = new Variable("x"); Variable y = new Variable("y"); Constant c = new Constant(true); ctx.assign(x. false); ctx.assign(y. true); exp = new Or(new Adn(c, x), new And(y, new Not(x)));
34. 调停者模式(Mediator)
包装了一系列对象相互作用的方式,使得这些对象不惜互相明显引用
调停者可以只有一个调停者和一系列的同事类角色
//抽象同事类 - 定义出调停者到同事对象的接口 public abstract class Colleague { private Mediator mediator; public Colleague(Mediator m) { mediator = m; } public Mediator getMediator() { return mediator; } public abstract void action(); //行动方法,由子类实现 public void change() { mediator.colleagueChanged(this); //调用此方法,可以改变对象内部状态 } } //具体同事类1 public class Colleague1 extends Colleague { public Colleague1(Mediator m) { super(m); } public void action() { System.out.println("This is an action from Colleague1"); } } //具体同事类1 public class Colleague2 extends Colleague { public Colleague2(Mediator m) { super(m); } public void action() { System.out.println("This is an action from Colleague2"); } } //抽象调停类 public abstract class Mediator { public abstract void colleagueChanged(Colleague c); //事件方法,由子类实现 public static void main(String args[]) { ConcreteMediator mediator = new ConcreteMediator(); mediator.createConcreteMediator(); Colleague c1 = new Colleague1(mediator); Colleague c2 = new Colleague2(mediator); mediator.colleagueChanged(c1); } } //具体调停类 public class ConcreteMediator extends Mediator { private Colleague1 colleague1; private Colleague2 colleague2; public void colleagueChanged(Colleague c) { colleague1.action(); colleague2.action(); } public void createConcreteMediator() { Colleague1 = new Colleague1(this); Colleague2 = new Colleague2(this); } public Colleague1 getColleague1() { return colleague1; } public Colleague2 getColleague2() { return colleague2; } }
相关推荐
《Java与模式》是阎宏博士撰写的一本经典IT著作,深入浅出地探讨了如何在Java编程中应用设计模式。这本书的光盘源码包含了书中提到的各种模式的实例代码,为读者提供了实践和理解设计模式的宝贵资源。在本文中,我们...
《Java与模式》是闫宏大师的一部经典之作,它将古老的哲学智慧——道德经的智慧,巧妙地融入到现代编程语言Java的设计模式之中。这本书不仅深入浅出地讲解了23种经典的设计模式,还提供了丰富的实践案例,旨在帮助...
1. Java设计模式的定义与重要性 设计模式是软件工程中一种被广泛认可和采纳的通用解决方案,用于解决特定上下文中的设计问题。设计模式分为三大类:创建型模式、结构型模式和行为型模式。这些模式的主要目的是提高...
《Java与模式》是阎宏博士撰写的一本经典著作,深入浅出地讲解了Java编程中的设计原则和设计模式。这本书对于任何想要提升Java编程能力,尤其是对设计模式有深入理解的开发者来说,都是一本不可多得的参考资料。书中...
《Java与模式》是阎宏的经典著作,这本书深入探讨了如何在Java编程中应用设计模式,为Java开发者提供了丰富的实践经验和理论指导。设计模式是软件工程中的重要概念,它总结了在特定情境下解决问题的常见方法,使得...
阎宏所著的java与模式一书PDF版
《Java与模式》是阎宏博士的一本经典著作,它深入浅出地介绍了如何在Java编程中应用设计模式。这本书不仅讲解了设计模式的基本概念,还涵盖了23种经典的GOF设计模式,并结合Java语言特性进行了详细的解释和实例演示...
《Java与模式》是阎宏著作的一本专为Java系统设计师深入理解设计原则和设计模式而编写的实用教材。这本书的核心目标是帮助开发者在面对复杂软件设计问题时,能够迅速而精准地应用设计原则和模式,提升代码质量和可...
《Java与模式》是一本深度探讨Java编程语言与设计模式结合应用的经典著作。设计模式是软件工程中的宝贵经验总结,是解决常见问题的有效方案模板。Java作为一种广泛应用的面向对象编程语言,其灵活性和强大功能使其...
本资料“java与模式”包含了一系列关于设计模式的学习材料,并提供了相应的源代码示例,便于读者理解和应用。 首先,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建,如...
《Java与模式》是闫宏博士撰写的一本深入探讨Java编程与设计模式的著作。这本书在Java开发领域具有很高的知名度,对于理解面向对象设计原则、提高软件开发能力有着重要的指导意义。以下是根据书名和描述提炼出的一些...
《Java与模式》这本书是Java开发者深入理解和应用设计模式的重要参考资料。它涵盖了多种经典的设计模式,旨在帮助读者提升代码质量,提高软件系统的可维护性和可扩展性。在Java编程领域,设计模式是不可或缺的知识,...
Java与模式的结合,意味着我们将探讨如何在Java编程中应用这些设计模式。设计模式分为三类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如适配器、装饰器、代理、桥接、组合、外观、享元)和行为型模式...
《Java与模式》是阎宏博士的一本经典著作,它深入浅出地介绍了如何在Java编程中应用设计模式。这本书的源码包含了全书各章节的实例代码,这对于学习和理解书中理论提供了直观且实践性的支持。以下是基于该书籍源码的...
根据提供的文件信息,我们可以推断出这是一份关于获取《Java与模式》这本书PDF版本的资源分享。然而,为了满足您对于详细知识点的需求,我们将会围绕《Java与模式》这一主题进行深入探讨,涵盖该书可能涉及的重要...
《Java与模式》是阎宏博士的一本经典著作,它深入浅出地讲解了如何在Java编程中应用设计模式。这本书对于理解面向对象设计原则、提高代码质量和可维护性具有极高的价值。高清版的PDF格式使得阅读体验更加舒适,方便...
《Java与模式》一书是Java编程领域中的经典之作,由资深软件开发人员撰写,深入浅出地介绍了如何在Java编程中应用设计模式。这本书旨在帮助开发者理解和掌握面向对象设计的原则,提高代码质量和可维护性。源代码是书...
《Java与模式》是一本深入探讨Java编程语言与设计模式结合的经典著作。这本书旨在帮助开发者在实际项目中更好地运用设计模式,提升代码质量和可维护性。随书源代码提供了丰富的实例,让读者能够通过实践来理解和掌握...