package com.cheng.zenofdesignpatterns.patternpk.structural;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.adapter.AUglyDuckling;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.adapter.Duck;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.adapter.Duckling;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.decorator.BeautifyAppearance;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.decorator.StrongBehavior;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.decorator.Swan;
import com.cheng.zenofdesignpatterns.patternpk.structural.decorator_vs_adapter.decorator.DUglyDuckling;
import com.cheng.zenofdesignpatterns.patternpk.structural.proxy_vs_decorator.decorator.DRunner;
import com.cheng.zenofdesignpatterns.patternpk.structural.proxy_vs_decorator.decorator.IDRunner;
import com.cheng.zenofdesignpatterns.patternpk.structural.proxy_vs_decorator.decorator.RunnerWithJet;
import com.cheng.zenofdesignpatterns.patternpk.structural.proxy_vs_decorator.proxy.IPRunner;
import com.cheng.zenofdesignpatterns.patternpk.structural.proxy_vs_decorator.proxy.PRunner;
import com.cheng.zenofdesignpatterns.patternpk.structural.proxy_vs_decorator.proxy.RunnerAgent;
public class ZoDPStructuralPKActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("结构类模式PK");
String content = "包括:\n" +
"外观模式(Facade)\n" +
"适配器模式(Adapter)\n" +
"代理模式(Proxy)\n" +
"装饰模式(Decorator)\n" +
"桥梁模式(Bridge)\n" +
"组合模式(Composite)\n" +
"享元模式(Flyweight)\n" +
"为什么叫结构类模式呢?因为它们都是通过组合类或对象产生更大结构以适应更高层次的" +
"逻辑需求。\n\n" +
"1. 代理模式 VS 装饰模式\n" +
"对于两个模式,首先要说的是,装饰模式就是代理模式的一个特殊应用,两者的共同点是" +
"都具有相同的接口,不同点则是代理模式着重对代理过程的控制,而装饰模式则是对类的" +
"功能进行加强或减弱,它着重类的功能变化。\n" +
"一个著名的短跑运动员有自己的代理人。如果你很仰慕他,你找运动员说“你跑个我看看”," +
"运动员肯定不搭理你,不过你找到他的代理人就不一样了,你可能和代理人比较熟,可以" +
"称兄道弟,这个代理人还是可以帮的,于是代理人同意让你欣赏运动员的练习赛。\n" +
"装饰模式是对类功能的加强,装饰类对类的行为没有决定权,只有增强作用,也就是说它" +
"不决定被代理的方法是否执行,它只是再次增加被代理的功能。\n\n" +
"2. 最佳实践\n" +
"代理模式是把当前的行为或功能委托给其他对象执行,代理类负责接口限定:是否可以调" +
"用真实角色,以及是否对发送到真实角色的消息进行变形处理,它不对被主题角色(也就" +
"是被代理类)的功能做任何处理,保证原汁原味的调用。代理模式使用到极致开发就是AOP," +
"这是各位采用Spring框架开发必然使用到的技术,它就是使用了代理和反射的技术。\n" +
"装饰模式是在要保证接口不变的情况下加强类的功能,它保证的是被修饰的对象功能比原" +
"始对象丰富(当然,也可以减弱),但不做准入条件判断和准入参数过滤,如是否可以执" +
"行累的功能,过滤输入参数是否合规等,这不是装饰模式关心的。\n\n" +
"3. 装饰模式 VS 适配器模式\n" +
"装饰模式和适配器模式在通用类图上没有太多的相似点,差别比较大,但是它们的功能有" +
"相似的地方:都是包装作用,都是通过委托方式实现其功能。不同点是:装饰模式包装的" +
"是自己的兄弟类,隶属于同一个家族(相同接口或父类),适配器模式则修饰非血缘关系" +
"类,把一个非本家族的对象伪装成本家族的对象,注意是伪装,因为它的本质还是非相同" +
"接口的对象。\n\n" +
"4. 最佳实践\n" +
"装饰模式和适配器模式有较多的不同点\n" +
"- 意图不同\n" +
"装饰模式的意图是加强对象的功能,而适配器模式关注的则是转化,它的主要意图是两个" +
"不同对象之间的转化。\n" +
"- 施与对象不同\n" +
"装饰模式装饰的对象必须是自己的同宗,也就是相同的接口或父类,只要在具有相同的属" +
"性和行为的情况下,才能比较行为是增强还是减弱;适配器模式则必须是两个不同的对象," +
"因为它着重于转换,只有两个不同的对象才有转换的必要,如果是相同对象还转换什么?\n" +
"- 场景不同\n" +
"装饰模式在任何时候都可以使用,只要是增强类的功能,而适配器模式则是一个补救模式," +
"一般出现在系统成熟或已经构建完毕的项目中,作为一个紧急处理手段采用。\n" +
"- 扩展性不同\n" +
"装饰模式很容易扩展,适配器模式就没那么容易扩展了。\n";
mContentTV.setText(content);
}
@Override
public void onClick(View v) {
// 1. 使用代理模式模拟运动员跑步
// 定义一个短跑运动员
IPRunner liuP = new PRunner();
// 定义liu的代理人
IPRunner agent = new RunnerAgent(liuP);
// 要求运动员跑步
System.out.println("====客人找到运动员的代理要求其去跑步===");
agent.run();
// 2. 使用装饰模式增强运动员
// 定义出运动员
IDRunner liuD = new DRunner();
//对其功能加强
liuD = new RunnerWithJet(liuD);
// 看看它的跑步情况如何
System.out.println("===增强后的运动员的功能===");
liuD.run();
// 3. 使用装饰模式模拟丑小鸭变成白天鹅
// 很久很久以前,这里有一个丑陋的小鸭子
System.out.println("===很久很久以前,这里有一只丑陋的小鸭子===");
Swan duckling = new DUglyDuckling();
// 展示一下小鸭
duckling.desAppaearance(); //小鸭子的外形
duckling.cry(); //小鸭子的叫声
duckling.fly(); //小鸭子的行为
System.out.println("\n===小鸭子终于发现自己是一只天鹅====");
// 首先外形变化了
duckling = new BeautifyAppearance(duckling);
// 其次行为也发生了改变
duckling = new StrongBehavior(duckling);
// 虽然还是叫丑小鸭,但是已经发生了很大变化
duckling.desAppaearance(); //小鸭子的新外形
duckling.cry(); //小鸭子的叫声
duckling.fly(); //小鸭子的新行为
// 4. 使用适配器演示丑小鸭变成白天鹅
//鸭妈妈有五个孩子,其中四个都是一个模样
System.out.println("===妈妈有五个孩子,其中四个模样是这样的:===");
Duck duck = new Duckling();
duck.cry(); // 小鸭子的叫声
duck.desAppearance(); // 小鸭子的外形
duck.desBehavior(); // 小鸭子的其他行为
System.out.println("\n===一只独特的小鸭子,模样是这样的:===");
Duck uglyDuckling = new AUglyDuckling();
uglyDuckling.cry(); // 丑小鸭的叫声
uglyDuckling.desAppearance(); // 丑小鸭的外形
uglyDuckling.desBehavior(); // 丑小鸭的其他行为
}
}