設計模式-裝飾模式&代理模式

繼續上一篇

裝飾模式

動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更爲靈活

在這裏插入圖片描述

Component是定義一個對象接口,可以給這些對象動態地添加職責

ConcreteComponent是定義了一個具體的對象,也可以給這個對象添加一些職責

Decorator,裝飾抽象類,繼承了Component,從外類來擴展Component類的功能,但對於Component來說,是無需知道Decorator的存在的

ConcreteDecorator就是具體的裝飾對象,起到Component添加職責的功能

Component類
public abstract class Component {
	public abstract void Operaion();
}

ConcreteComponent類
public class ConcreteComponent extends Component {

	@Override
	public void Operaion() {
		// TODO Auto-generated method stub
		System.out.println("具體對象的操作");
	}

}

Decorator類
public abstract class Decorator extends Component {
	protected Component component;
	//設置Component
	public void SetComponent(Component component){
		this.component=component;
	}
	//重寫Operation(),實際執行的是Component的Operation()
	public void Operation(){
		if(component!=null){
			component.Operaion();
		}
	}
	
}

ConcreteDecoratorA類
public class ConcreteDecoratorA extends Decorator {

	
	//本類的獨有功能,以區別於ConcreteDecoratorB
	private String addedState;
	@Override
	public void Operaion() {
		// TODO Auto-generated method stub
		super.Operation();
		addedState="new State";
		System.out.println("具體裝飾對象A的操作");
	}

}

ConcreteDecoratorB類

public class ConcreteDecoratorB extends Decorator {

	@Override
	public void Operaion() {
		// TODO Auto-generated method stub
		super.Operation();
		AddedBehavior();
		System.out.println("具體裝飾對象B的操作");
	}
	//本類的獨有的方法,以區別於ConcreteDecoratorA
	private void AddedBehavior(){
		
	}

}

當需要在主類中加入了新的字段,新的方法和新的邏輯,從而增加了主類的複雜
而裝飾模式卻提供了很好的解決方案,它把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的對象。

代理模式

爲其他對象提供一種代理以控制對這個對象的訪問

在這裏插入圖片描述

Subject 類
public abstract class Subject {
	public abstract void Request();
}
RealSubject類
public class RealSubject extends Subject {

	@Override
	public void Request() {
		// TODO Auto-generated method stub
		System.out.println("真實的請求");
	}
	
}
Proxy類
public class Proxy extends Subject {
	
	RealSubject realSubject;
	@Override
	public void Request() {
		// TODO Auto-generated method stub
		if(realSubject==null){
			realSubject=new RealSubject();
		}
		realSubject.Request();
	}
	
}

客戶端
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Proxy proxy=new Proxy();
		proxy.Request();
	}

}

適應場景

第一. 遠程代理,也就是爲一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實
第二. 虛擬代理,是根據需要創建開銷很大的對象,通過它來存放實例化需要很長時間的真實對象
第三. 安全代理,用來控制真實對象訪問時的權限
第四. 智能指引,是指調用真實的對象時,代理處理另外一些事

發佈了20 篇原創文章 · 獲贊 6 · 訪問量 4908
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章