职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 356|回复: 4

代理 与 子类化

[复制链接]
gz-vps 发表于 2011-9-2 11:21 | 显示全部楼层 |阅读模式
最近看一个斯坦福的视频, 里面的Cocoa框架大量使用了代理模式,定制类的行为,

学生就发问了,为什么不采用子类化的策略呢,

老师就说了 子类化 和 代理都是起到代码分离的作用。无所谓对错,有人喜欢子类化,有人喜欢代理,这是一个需要综合考虑的设计决策


自己写点东西记一下

  
package delegate.subclass;   
  
public class UIApplication {   
  
    Object view = new Object();   
  
    public String draw() {   
        return "draw a button on view" + view;   
    }   
}  

package delegate.subclass;

public class UIApplication {

    Object view = new Object();

    public String draw() {
        return "draw a button on view" + view;
    }
}
  
package delegate.subclass;   
  
public class UIApplicationSubclassA extends UIApplication {   
  
    public String draw() {   
        return "draw a text on view " + view;   
    }   
}  

package delegate.subclass;

public class UIApplicationSubclassA extends UIApplication {

    public String draw() {
        return "draw a text on view " + view;
    }
}   
package delegate.subclass;   
  
public class UIApplicationSubclassB extends UIApplication {   
      
    public String draw() {   
        return "draw a label on view " + view;   
    }   
      
}  

package delegate.subclass;

public class UIApplicationSubclassB extends UIApplication {
   
    public String draw() {
        return "draw a label on view " + view;
    }
   
}


  
package delegate.delegate;   
  
public class UIApplcation {   
      
    Object view;   
  
    IViewController delegate;   
      
  
    public void setDelegate (IViewController delegate ){   
        this.delegate = delegate;   
        view=delegate.getView();   
    }   
      
    public String draw(){   
        return delegate.draw();   
    }   
}  

package delegate.delegate;

public class UIApplcation {
   
    Object view;

    IViewController delegate;
   

    public void setDelegate (IViewController delegate ){
        this.delegate = delegate;
        view=delegate.getView();
    }
   
    public String draw(){
        return delegate.draw();
    }
}
  
package delegate.delegate;   
  
public interface IViewController {   
    String draw();   
    Object getView();   
}  

package delegate.delegate;

public interface IViewController {
    String draw();
    Object getView();
}


  
package delegate.delegate;   
  
public class AppDelegateA implements IViewController {   
  
    Object view = new Object();   
  
    @Override  
    public String draw() {   
        return "draw a text on view " + view;   
    }   
  
    @Override  
    public Object getView() {   
        return view;   
    }   
  
}  

package delegate.delegate;

public class AppDelegateA implements IViewController {

    Object view = new Object();

    @Override
    public String draw() {
        return "draw a text on view " + view;
    }

    @Override
    public Object getView() {
        return view;
    }

}   
package delegate.delegate;   
  
public class AppDelegateB implements IViewController {   
  
    Object view = new Object();   
  
    @Override  
    public String draw() {   
        return "draw a label on view " + view;   
    }   
  
    @Override  
    public Object getView() {   
        return view;   
    }   
  
}  

package delegate.delegate;

public class AppDelegateB implements IViewController {

    Object view = new Object();

    @Override
    public String draw() {
        return "draw a label on view " + view;
    }

    @Override
    public Object getView() {
        return view;
    }

}



  
package delegate;   
  
import delegate.delegate.AppDelegateA;   
import delegate.delegate.AppDelegateB;   
import delegate.subclass.UIApplication;   
import delegate.subclass.UIApplicationSubclassA;   
import delegate.subclass.UIApplicationSubclassB;   
  
public class Client {   
    public static void main(String[] args) {   
        System.out.println("test subclass---------------------");   
        UIApplication sub1 =new UIApplicationSubclassA();   
        System.out.println(sub1.draw());   
           
        UIApplication sub2 =new UIApplicationSubclassB();   
        System.out.println(sub2.draw());   
           
           
        System.out.println("test delegate---------------------");   
        delegate.delegate.UIApplcation app1 =new  delegate.delegate.UIApplcation();   
        AppDelegateA delegateA= new AppDelegateA();   
        app1.setDelegate(delegateA);   
        System.out.println(app1.draw());   
           
        delegate.delegate.UIApplcation app2 =new  delegate.delegate.UIApplcation();   
        AppDelegateB delegateB= new AppDelegateB();   
        app2.setDelegate(delegateB);   
        System.out.println(app2.draw());   
    }   
}  

package delegate;

import delegate.delegate.AppDelegateA;
import delegate.delegate.AppDelegateB;
import delegate.subclass.UIApplication;
import delegate.subclass.UIApplicationSubclassA;
import delegate.subclass.UIApplicationSubclassB;

public class Client {
    public static void main(String[] args) {
        System.out.println("test subclass---------------------");
        UIApplication sub1 =new UIApplicationSubclassA();
        System.out.println(sub1.draw());
        
        UIApplication sub2 =new UIApplicationSubclassB();
        System.out.println(sub2.draw());
        
        
        System.out.println("test delegate---------------------");
        delegate.delegate.UIApplcation app1 =new  delegate.delegate.UIApplcation();
        AppDelegateA delegateA= new AppDelegateA();
        app1.setDelegate(delegateA);
        System.out.println(app1.draw());
        
        delegate.delegate.UIApplcation app2 =new  delegate.delegate.UIApplcation();
        AppDelegateB delegateB= new AppDelegateB();
        app2.setDelegate(delegateB);
        System.out.println(app2.draw());
    }
}


console
  
test subclass---------------------   
draw a text on view java.lang.Object@14318bb  
draw a label on view java.lang.Object@ca0b6  
test delegate---------------------   
draw a text on view java.lang.Object@1b67f74  
draw a label on view java.lang.Object@173a10f  

test subclass---------------------
draw a text on view java.lang.Object@14318bb
draw a label on view java.lang.Object@ca0b6
test delegate---------------------
draw a text on view java.lang.Object@1b67f74
draw a label on view java.lang.Object@173a10f  

天上智喜 发表于 2011-9-2 11:21 | 显示全部楼层
有一条Design Principle: Favor composition over inheritance.

shmilyyu 发表于 2011-9-2 11:21 | 显示全部楼层
对delegate的翻译,比较习惯用委托。
看到你说代理,还以为是Proxy

木已 发表于 2011-9-2 11:21 | 显示全部楼层
组合总比继承好。。

有烟没火 发表于 2011-9-2 11:21 | 显示全部楼层
一般是组合或者聚合 这种关系比继承关系要好些,组合模式不一样。

采用组合或者聚合有助于保持每个类被封装到单个任务上,这样类和继承的层次规模保持最小,不可能增长成为庞然大物。

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-6 04:30 , Processed in 0.127438 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表