繼續上一篇
裝飾模式
動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更爲靈活
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();
}
}
適應場景
第一. 遠程代理,也就是爲一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實
第二. 虛擬代理,是根據需要創建開銷很大的對象,通過它來存放實例化需要很長時間的真實對象
第三. 安全代理,用來控制真實對象訪問時的權限
第四. 智能指引,是指調用真實的對象時,代理處理另外一些事