java设计模式(一)——适配器、桥接、建造者、职责链、命令

一、Adapter适配器设计模式

当我们要组合两个不相干的类时,第一种解决方案是修改各自类的接口。但是如果没有源码,或者不愿意为了一个应用而修改各自的接口,则需要使用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和从网上查找到的学习资料,装载请注明出处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值