Delegate Method (委托函数):是一种结合接口、多态、封装等特性的用于代理(委托)模式设计的一种函数。
委托模式:在软件工程中,委托模式是一种面向对象的设计模式,允许对象组合实现与继承相同的代码重用。
详见维基-https://en.wikipedia.org/wiki/Delegation_pattern
作用:为其他对象提供一种类似代理的方式以控制对这个对象的访问。
例子:
关于 Delegate 设计模式,可以这么理解:
(以下故事纯属虚构,我是小米的忠实粉)
故事很简单……某次小米发布会上,大屏幕显示着 本款小米8采用的是三星的OLED屏幕!
身为科技盲的你觉得小米真牛逼,
于是跑去问三星:"你们这么大方给了小米OLED技术?"
三星一脸懵逼:"屁咧!我给小米OLED技术干嘛,找抽啊?"
-------------------------------
原来事实是这样的,OLED技术 三星-有、华为-有、代理商富土康-也有,小米-没有。
· 三星、华为有自己的OLED技术图纸,本来小米胆子大直接偷来他们API就可以生产OLED屏幕了哈哈哈。
· 但是 小米又不好意思直接调 三星 或 华为的Oled接口 去生产OLED屏幕。
- OLED技术接口长这样儿的:
/**
* @Description: A screen Tch for a phone 一种手机屏幕技术 (接口)
* OLED Tch has a final stander OLED屏幕技术有一个业界通用的标准,但是具体的生产技术流程每个大公司有自己的技术工艺
*/
public interface OledTch {
//技术名称
public void tchName();
//色彩饱和度
public void colorSaturation();
}
- 三星的OLED设计图纸(华为同理):
/**
*
* @Description: Object of Sumsung company 三星公司,有自己的OLED的生产技术, 继承OLED 接口
* @Date: Oct 6, 2018 4:32:30 PM
*/
public class Sumsung implements OledTch {
@Override
public void tchName() {
// TODO Auto-generated method stub
System.out.print("Sumsung OLED");
}
@Override
public void colorSaturation() {
// TODO Auto-generated method stub
System.out.print("98%NTSC - Sumsung OLED");
}
}
· 于是乎,雷军爸爸想到了找 代理商-富土康 帮忙生产 三星的OLED屏幕。
/** 注意了:
1、Oled 接口,虽说名字一样、屏幕效果一样的,但是三星的OLED技术 和 华为的OLED技术在生产工序上还是有很大不同的。
2、富土康 其实没有自己的OLED生产图纸,但实质上 无论谁叫他代理去生产OLED屏幕,他都默认用 华为的OLED生产图纸。
- (代理商)富土康的类
/**
*
* @Description: Object of FoXcoon company 富土康公司,没有自己的OLED的生产技术, 有生产版权,也继承OLED 接口 (我相信真正的富S康有的!~)
* @Date: Oct 6, 2018 4:54:24 PM
*/
public class Fotconn implements OledTch {
private OledTch oledMap; //富土康的OLED生产图纸
//构造函数:甲方指定用哪家的图纸就用哪家的图纸
public Fotconn(OledTch oledMap) {
this.oledMap = oledMap;
}
//构造函数:默认情况下,用华为的生产图纸
public Fotconn() {
this.oledMap = new Huawei();
}
@Override
public void tchName() {
// TODO Auto-generated method stub
System.out.print("| 富土康生产的——");
oledMap.tchName();
System.out.print(" |");
}
@Override
public void colorSaturation() {
// TODO Auto-generated method stub
System.out.print("| 富土康生产的——");
oledMap.colorSaturation();
System.out.print(" |");
}
}
- (委托商)小米的生产线上,是这样的:
/**
* @Description: Pipeline of Xiaomi, who require a production of SumsungOLED but product by Fotconn (小米,要通过富土康来代理生产 三星的OLED产品)
* @Date: Oct 6, 2018 5:05:35 PM
*/
public class Xiaomi_Pipeline {
public void oled() {
Sumsung sumsung = new Sumsung(); //确定使用三星的OLED技术
Fotconn fotconn = new Fotconn(sumsung);//告诉乙方 富土康:“我要三星图纸生产的OLED”
System.out.println("小米正在生产: ");
fotconn.tchName();
fotconn.colorSaturation();
}
}
生产开始了: 在 小米8的生产流水线里,new 了一个 用三星图纸生产的富土康 Fotconn(new Samsung()), 这样用富土康生产的OLED屏幕,在发布会上就说是采用三星OLED屏幕啦~ 代理成功!
- 建立小米8的Junit 测试类
/**
* @Description: Test for Xiaomi8
* @Date: Oct 6, 2018 7:34:59 PM
*/
public class Xiaomi_PipelineTest {
@Test
public void testXiaomi8() {
Xiaomi_Pipeline xiaomi8 = new Xiaomi_Pipeline();
xiaomi8.oled();
}
}
运行结果:
至此,小米8成功通过 代理商富土康 生产 三星的OLED 手机屏幕啦;
更多例子可参考这俩文章: