java设计模式(一)——适配器、桥接、建造者、职责链、命令
2013-10-19 22:35
597 查看
一、Adapter适配器设计模式
当我们要组合两个不相干的类时,第一种解决方案是修改各自类的接口。但是如果没有源码,或者不愿意为了一个应用而修改各自的接口,则需要使用Adapter适配器,在两种接口之间创建一个混合接口。
适配器设计模式中有3个重要角色:被适配者Adaptee,适配器Adapter和目标对象Target。
其中两个现存的想要组合到一起的类分别是被适配者Adaptee和目标对象Target角色,我们需要创建一个适配器Adapter将其组合在一起。
常用有两种方法:组合适配器模式,继承适配器模式
1、组合适配器模式:假设要画图形,有圆形和方形两个类,现在需要一个既可以画圆形又可以画方形的类。
输出结果:
Draw circle
Draw square
2、继承适配器模式
输出结果:
Draw circle
Draw square
二、Bridge桥接设计模式
桥接设计模式是将一组功能(实现)与另一组使用该功能的其他对象(行为)分离开来,以便达到单一因素变化,然后使用对象调用的方式将这两组关联系起来,将问题的行为和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题。假设我们现在有两个图形,有两种画法,实现如下:
输出结果:
I am Circle.
Drawing solide line…
I am Circle.
Drawing dash line…
I am Rectangle.
Drawing solide line…
I am Rectangle.
Drawing dash line…
假设我们需要增加一个三角形,则我们主要多增加一个实现了Shape的接口就好了,如下
然后我们要画一个是虚线的三角形,则这样调用
输出结果:
I am Triangle.
Drawing dash line…
三、Builder建造者模式
Builder建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不需要了解所构建对象的内部具体构建细节,Builder建造设计模式的目的是为了将构造复杂对象的过程和它的部件解耦。
Builder建造者设计模式中有两个重要角色:Director指导者和Builder建造者。Director指导者相当于设计师或架构师,拥有整个产品各个部件之间关系的构建蓝图。Builder建造者是部件的具体创建者,Builder建造者根据Director指导者的指示创建产品的各个部件,最终由Director构建出完整产品。要向builder要Product而不是向知道建造过程的Director要。
举例说明,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要!
输出结果:
房子已经建好了
四、ChainOfResponsibility责任链设计模式
责任链设计模式是用一系列请求处理器试图处理一个请求,这些请求处理器之间是一个松散耦合,唯一的共同点是在他们之间传递请求。例如客户端发送一个请求,请求处理器A先处理,如果A没有处理或者无法处理,就将请求传递给请求处理器B,如果B没有处理或者无法处理,就将请求传递到请求处理器C去处理,所有这些请求处理器构成一条请求处理责任链。一个处理数字,字母和特殊符号的例子:
输出结果:
Number has been handled
Character has been handled
Symbol has been handled
五、Command命令设计模式
Command命令设计模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行操作。Command命令设计模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作,命令请求发出请求要求执行一个操作;命令接受方收到请求,并执行操作。命令模式允许命令请求方和命令接收方独立开来,使得命令请求方不必 知道命令接收方的接口,更不必知道请求是怎么被接收,以及操作是否被执行,何时被执行,以及是怎么被执行的。
Command命令设计模式中5个角色:
(1).抽象命令角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个java接口或java抽象类实现。
(2).请求者(Invoke)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
(3).接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
(4).具体命令角色:定义一个接受者和行为之间的弱耦合;实现execute方法,负责调用接收者的相应操作。execute方法通常叫做 执行方法。
(5).客户角色:创建了一个具体命令对象并确定其接收者。
模拟对电视机的操作开机、关机命令
输出结果:
The televisino is on.
The television is off.
备注:java设计模式的学习主要是参考一位牛人http://blog.csdn.net/chjttony和从网上查找到的学习资料,装载请注明出处。
当我们要组合两个不相干的类时,第一种解决方案是修改各自类的接口。但是如果没有源码,或者不愿意为了一个应用而修改各自的接口,则需要使用Adapter适配器,在两种接口之间创建一个混合接口。
适配器设计模式中有3个重要角色:被适配者Adaptee,适配器Adapter和目标对象Target。
其中两个现存的想要组合到一起的类分别是被适配者Adaptee和目标对象Target角色,我们需要创建一个适配器Adapter将其组合在一起。
常用有两种方法:组合适配器模式,继承适配器模式
1、组合适配器模式:假设要画图形,有圆形和方形两个类,现在需要一个既可以画圆形又可以画方形的类。
//适配器 class Adapter extends Circle{ private Square square; public Adapter(Square square){ this.square = square; } public void drawSquare(){ square.drawSquare(); } } // 圆形,目标对象 class Circle { public void drawCircle() { System.out.println("Draw circle"); } } // 方形,被适配对象 class Square { public void drawSquare() { System.out.println("Draw square"); } } //既可以画圆形,又可以画方形,适配器 public class AdapterCombination{ public static void main(String[] args) { Adapter adapter = new Adapter(new Square()); adapter.drawCircle(); adapter.drawSquare(); } }
输出结果:
Draw circle
Draw square
2、继承适配器模式
class Adapter2 implements ICircle, ISquare { private ISquare square; private ICircle circle; public Adapter2(Square2 square) { this.square = square; } public Adapter2(Circle2 circle) { this.circle = circle; } public Adapter2(Square2 square,Circle2 circle){ this.square = square; this.circle = circle; } public void drawSquare() { square.drawSquare(); } public void drawCircle() { circle.drawCircle(); } } interface ICircle { public void drawCircle(); } interface ISquare { public void drawSquare(); } // 圆形 class Circle2 implements ICircle { public void drawCircle() { System.out.println("Draw circle"); } } // 方形 class Square2 implements ISquare { public void drawSquare() { System.out.println("Draw square"); } } public class AdapterExtend { public static void main(String[] args) { Adapter2 adapter2 = new Adapter2(new Square2(),new Circle2()); adapter2.drawCircle(); adapter2.drawSquare(); } }
输出结果:
Draw circle
Draw square
二、Bridge桥接设计模式
桥接设计模式是将一组功能(实现)与另一组使用该功能的其他对象(行为)分离开来,以便达到单一因素变化,然后使用对象调用的方式将这两组关联系起来,将问题的行为和实现分离开来实现,通过用聚合代替继承来解决子类爆炸性增长的问题。假设我们现在有两个图形,有两种画法,实现如下:
public class BridgePattern { public static void main(String[] args) { //画一个实线的圆 Drawing draw1 = new SolidDrawing(); Shape shape1 = new Circle(draw1); shape1.doDraw(); //画一个虚线的圆 Drawing draw2 = new DashDrawing(); Shape shape2 = new Circle(draw2); shape2.doDraw(); //画一个实线的矩形 Drawing draw3 = new SolidDrawing(); Shape shape3 = new Rectangle(draw3); shape3.doDraw(); //画一个虚线的矩形 Drawing draw4 = new DashDrawing(); Shape shape4 = new Rectangle(draw4); shape4.doDraw(); } } // 行为,使用功能的类 interface Shape { public void doDraw(); } class Circle implements Shape { private Drawing draw; public Circle(Drawing draw) { this.draw = draw; } public void doDraw() { System.out.println("I am Circle."); draw.draw(); } } class Rectangle implements Shape { private Drawing draw; public Rectangle(Drawing draw) { this.draw = draw; } public void doDraw() { System.out.println("I am Rectangle."); draw.draw(); } } // 实现,提供功能的类 interface Drawing { public void draw(); } class SolidDrawing implements Drawing { public void draw() { System.out.println("Drawing solide line…"); } } class DashDrawing implements Drawing { public void draw() { System.out.println("Drawing dash line…"); } }
输出结果:
I am Circle.
Drawing solide line…
I am Circle.
Drawing dash line…
I am Rectangle.
Drawing solide line…
I am Rectangle.
Drawing dash line…
假设我们需要增加一个三角形,则我们主要多增加一个实现了Shape的接口就好了,如下
class Triangle implements Shape{ private Drawing draw; public Triangle(Drawing draw){ this.draw = draw; } public void doDraw() { System.out.println("I am Triangle."); draw.draw(); } }
然后我们要画一个是虚线的三角形,则这样调用
Drawing draw5 = new DashDrawing(); Shape shape5 = new Triangle(draw5); shape5.doDraw();
输出结果:
I am Triangle.
Drawing dash line…
三、Builder建造者模式
Builder建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们,用户不需要了解所构建对象的内部具体构建细节,Builder建造设计模式的目的是为了将构造复杂对象的过程和它的部件解耦。
Builder建造者设计模式中有两个重要角色:Director指导者和Builder建造者。Director指导者相当于设计师或架构师,拥有整个产品各个部件之间关系的构建蓝图。Builder建造者是部件的具体创建者,Builder建造者根据Director指导者的指示创建产品的各个部件,最终由Director构建出完整产品。要向builder要Product而不是向知道建造过程的Director要。
举例说明,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要!
//建造者: interface Builder { public void makeWindow(); public void makeFloor(); public String submitRoom(); } class Mingong implements Builder { private String window=""; private String floor=""; public void makeWindow() { window=new String("window"); } public void makeFloor(){ floor=new String("floor"); } // 交房子给房主 public String submitRoom() { if((!window.equals(""))&&(!floor.equals(""))) { return "房子已经建好了"; } else{ return null; } } } //指挥者: class Designer{ // 指挥民工进行工作 public void order(Builder builder) { builder.makeWindow(); builder.makeFloor(); } } public class BuilderPattern { public static void main(String[] args) { Builder mingong = new Mingong(); Designer designer = new Designer(); designer.order(mingong); System.out.println(mingong.submitRoom()); } }
输出结果:
房子已经建好了
四、ChainOfResponsibility责任链设计模式
责任链设计模式是用一系列请求处理器试图处理一个请求,这些请求处理器之间是一个松散耦合,唯一的共同点是在他们之间传递请求。例如客户端发送一个请求,请求处理器A先处理,如果A没有处理或者无法处理,就将请求传递给请求处理器B,如果B没有处理或者无法处理,就将请求传递到请求处理器C去处理,所有这些请求处理器构成一条请求处理责任链。一个处理数字,字母和特殊符号的例子:
// 抽象请求处理器 abstract class Handler { private Handler successor; public Handler() { } public Handler(Handler successor) { this.successor = successor; } public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handRequest(Request request); } // Request请求类 class Request { private String type; public Request(String type) { this.type = type; } public String getType() { return type; } } // 数字请求处理器 class NumberHandler extends Handler { public NumberHandler() { } public NumberHandler(Handler successor) { super(successor); } public void handRequest(Request request) { if (request.getType().equals("Number")) { System.out.println("Number has been handled"); } // 传递到下一个请求处理器处理 else { getSuccessor().handRequest(request); } } } // 字母请求处理器 class CharacterHandler extends Handler { public CharacterHandler() { } public CharacterHandler(Handler successor) { super(successor); } public void handRequest(Request request) { if (request.getType().equals("Character")) { System.out.println("Character has been handled"); } // 传递到下一个请求处理器处理 else { getSuccessor().handRequest(request); } } } // 特殊符号请求处理器 class SymbolHandler extends Handler { public SymbolHandler() { } public SymbolHandler(Handler successor) { super(successor); } public void handRequest(Request request) { if (request.getType().equals("Symbol")) { System.out.println("Symbol has been handled"); } // 传递到下一个请求处理器处理 else { getSuccessor().handRequest(request); } } } public class ChainOfResponsibilityPattern { public static void main(String[] args) { Handler numberHandler = new NumberHandler(); Handler characterHandler = new CharacterHandler(); Handler symbolHandler = new SymbolHandler(); numberHandler.setSuccessor(characterHandler); characterHandler.setSuccessor(symbolHandler); Request request1 = new Request("Number"); Request request2 = new Request("Character"); Request request3 = new Request("Symbol"); numberHandler.handRequest(request1); numberHandler.handRequest(request2); numberHandler.handRequest(request3); } }
输出结果:
Number has been handled
Character has been handled
Symbol has been handled
五、Command命令设计模式
Command命令设计模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行操作。Command命令设计模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作,命令请求发出请求要求执行一个操作;命令接受方收到请求,并执行操作。命令模式允许命令请求方和命令接收方独立开来,使得命令请求方不必 知道命令接收方的接口,更不必知道请求是怎么被接收,以及操作是否被执行,何时被执行,以及是怎么被执行的。
Command命令设计模式中5个角色:
(1).抽象命令角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个java接口或java抽象类实现。
(2).请求者(Invoke)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
(3).接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
(4).具体命令角色:定义一个接受者和行为之间的弱耦合;实现execute方法,负责调用接收者的相应操作。execute方法通常叫做 执行方法。
(5).客户角色:创建了一个具体命令对象并确定其接收者。
模拟对电视机的操作开机、关机命令
//抽象命令角色 interface Command { public void execute(); } //请求者角色,遥控器 class InvokerControl { private Command command; public InvokerControl(Command command) { this.command = command; } public void action() { command.execute(); } } //接收者角色,TV class ReceiverTv{ public void turnOn() { System.out.println("The televisino is on."); } public void turnOff() { System.out.println("The television is off."); } } //具体命令类,开电视 class TurnOnCommand implements Command { private ReceiverTv receiver; public TurnOnCommand(ReceiverTv receiver) { this.receiver = receiver; } public void execute() { receiver.turnOn(); } } //具体命令类,关电视 class TurnOffCommand implements Command { private ReceiverTv receiver; public TurnOffCommand(ReceiverTv receiver) { this.receiver = receiver; } public void execute() { receiver.turnOff(); } } public class CommandPattern { public static void main(String[] args) { // 客户端创建命令接受者 ReceiverTv tv = new ReceiverTv(); // 客户端创建具体命令,并指定命令接受者 Command command = new TurnOnCommand(tv); // 客户端创建请求者,并给请求者指定具体命令 InvokerControl invoker = new InvokerControl(command); // 命令请求者发出命令请求 invoker.action(); Command command2 = new TurnOffCommand(tv); InvokerControl invoker2 = new InvokerControl(command2); invoker2.action(); } }
输出结果:
The televisino is on.
The television is off.
备注:java设计模式的学习主要是参考一位牛人http://blog.csdn.net/chjttony和从网上查找到的学习资料,装载请注明出处。
相关文章推荐
- java设计模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,。 行为型模式,共十一种:策略模式、模板方法)
- Java设计模式(三)Adapter(适配器),Bridge(桥接)
- 模式设计--适配器、桥接模式
- JAVA设计模式之桥接模式
- (设计模式四)java设计模式之建造者模式
- Java设计模式之适配器设计模式
- 设计模式(JAVA)-------建造者模式
- java 23种设计模式(4):建造者模式
- JAVA设计模式学习——命令模式
- 精通Java设计模式从初见到相爱之建造者模式(6)
- Java设计模式之责任链模式、职责链模式
- 设计模式之桥接模式(Java语言描述)
- JAVA设计模式之桥接模式
- Java设计模式百例 - 建造者模式
- JAVA设计模式-16-桥接模式
- Java 设计模式 接口型模式 之 适配器Adapter模式 (二)
- java设计模式之建造者模式
- Java设计模式_(结构型)_桥接模式
- Java设计模式之责任链模式、职责链模式
- java设计模式_建造者模式