zoukankan      html  css  js  c++  java
  • 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现)

      “一入软件深似海,从此早睡是路人。黑夜给了我黑色的眼睛,我却用他去寻找八阿哥。”“怎么了,又来那么多的感慨啊。”“还能有什么啊,老板是说让换个APP做,这个APP现在不行了,这都是这三个月来第4个APP了、、、”“这个啊,那不是简单的很么?”“简单,别闹了,你以为APP是大白菜啊,说有就有啊。”“这个时候就是我桥接模式出场的时候了~”

    桥接模式之自我介绍

      大家好,我的英文名字叫“Qiaojie Moshi”,我的中文名字叫桥接模式。(欸?哪里优点不对,哦,这小子,糊弄我呢,碎碎念一阵后作者对着桥接模式一阵拳打脚踢)。桥接模式鼻青脸肿的说“我的英文名字是、、、是Bridge Pattern”,不是先前说的那个,开个玩笑而已、、、至于下那么重的手么。“嘿嘿,那个手滑了”。相关定义如下:Decouple an abstraction from its implementation so that two can vary independently。(作者盯着桥接模式。)“老大,这次是真的,我没开玩笑。”“哦,没事,我就随便看看。”翻译过来是将抽象和实现解耦,使得两者可以独立地变化。我的重点就是“解耦”,如何让抽象和实现解耦就是需要了解的重点。下面先来看看桥接模式的类图:

      

      现在来详细介绍下各个角色:

    • Abstract:抽象化角色。主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
    • Implementor:实现化角色。是接口或者抽象类,定义角色必需的行为和属性。
    • RefinedAbstract:修正抽象化角色。实现接口或抽象类定义的方法和属性。
    • ConcreteImplementor*:具体实现方法类。

    桥接模式之自我分析

      身为一个“每日三省吾身之人”,缺点早已改进,因此剩下的也就只有优点了(作者按:别嘚瑟了,赶紧说重点。)别扔鸡蛋啊,咳咳,那个,我的优点有下面这几条:

    • 分离接口及其实现部分。这也是我的主要特点,毕竟也是为了解决继承的缺点而提出的设计模式嘛。
    • 优秀的扩充能力。
    • 实现细节对客户的透明。因此你们完全不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

    桥接模式之实现

      既然你们不信,看来今天不露两手是镇不住你们了,好了,看我的大招:

      既然说到了APP,那我们就来谈谈APP,首先是抽象APP类:

    1 public abstract class App{
    2     //首先要设计,什么数据库设计、框架选取、概要设计、详细设计等等
    3     public abstract void beDesigned();
    4     //然后是编码实现
    5     public abstract void beCoded();
    6     //最后是测试
    7     public abstract void beTest();
    8 }

      假设是社交类APP:

     1 public class ChatApp extends App{
     2     //首先要设计,什么数据库设计、框架选取、概要设计、详细设计等等
     3     public abstract void beDesigned(){
     4         System.out.println("调研,写文档、写文档、、、");
     5     }
     6     //然后是编码实现
     7     public abstract void beCoded(){
     8         System.out.println("我是一个程序员,加班Coding中");
     9     }
    10     //最后是测试
    11     public abstract void beTest(){
    12         System.out.println("test、test、test、、、");
    13     }
    14 }
    View Code

      然后APP产品自然是由互联网公司生产的了,下面是抽象的公司类:

     1 public abstract class Corp{
     2     //定义一个抽象APP对象,但是不知道具体是什么
     3     private App app;
     4     //构造函数,由子类定义传递具体产品
     5     public Corp(App app){
     6         this.app = app;
     7     }
     8 
     9     //制作APP
    10     public void developApp(){
    11         this.app.beDesigned();
    12         this.app.beCoded();
    13         this.app.beTest();
    14     }
    15 }
    View Code

      这里是有参构造,因为继承的子类需要重写自己的有参构造函数,把APP的类传进来,首先看一下APP公司的实现:

     1 public class AppCorp extends Corp{
     2     //生产的App 待定,据需求而定
     3     public AppCorp(App app){
     4         super(app);
     5     }
     6 
     7     //生产App
     8     public void developApp(){
     9         super.developApp();
    10         System.out.println("要什么制作什么APP");
    11     }
    12 }
    View Code

      具体使用看如下的场景类:

    1 public class Client{
    2     public static void main(String[] args) {
    3         AppCorp appCorp = new AppCorp(new ChatApp());
    4         appCorp.developApp();
    5     }
    6 }

      怎么样,是不是很厉害,是不是对我的敬仰犹如滔滔江水奔流不止啊~(作者按:滚。众读者已吐得天昏地暗。)

    桥接模式之应用场景

      刚刚桥接模式有事走了(别拉我,让我讲完啊~~~),所以由我给大家继续讲解应用场景:

    • 当你不希望抽象和实现之间有一个固定的绑定关系的时候。
    • 类的抽象和它的实现都应该可以通过生成子类的方法加以扩充。
    • 对一个抽象的实现部分的修改应对客户不产生影响。
    • 你想对客户完全隐藏抽象的实现部分。
    • 有许多的类要生成。
    • 你想对多个对象间共享实现,但同时要求客户并不知道这一点。

      以上就是本次要说的全部内容,荆轲刺秦王,设计模式心中藏~(好像有什么不对)

     

       PS:本博客欢迎转发,但请注明博客地址及作者~

       博客地址:http://www.cnblogs.com/voidy/

       博客新址:http://voidy.net

       <。)#)))≦

  • 相关阅读:
    解释下Http请求头和常见响应状态码
    sys 模块常用方法
    os 模块常用方法
    说明os,sys模块有什么不同
    dict 的 items() 方法与 iteritems() 方法的不同?
    Python是如何进行类型转换的?
    Python中pass语句的作用是什么?
    创建一个简单tcp服务器需要的流程
    安全性
    传输数据的大小
  • 原文地址:https://www.cnblogs.com/voidy/p/4242858.html
Copyright © 2011-2022 走看看