23种设计模式模式详解 Java 结构型模式(二)

23种设计模式模式详解 Java 结构型模式(二)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式的好处:代码的可重用性、可扩展性,可阅读性,保证代码的可靠。(代码要优雅)

关于相关源码可以在GitHub上下载:
https://github.com/rickey17/design

  • 适配器模式
  • 装饰模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式

适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

类的适配器模式

核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,将Source的功能扩展到Targetable里

存在问题:对于原来的功能,需要提供新的接口。
违背原则:开闭原则
解决方案:新增适配器类以及接口,客户端调用接口

UML 类图:
这里写图片描述

源码:

public class Source {

    public void method1(){

    }

}

public interface Targetable {

    public void method1();

    public void method2();

}

public class Adapter extends Source implements Targetable {

    public void method1(){

    }

    public void method2(){

    }

}

public class Client {


    /**
     * 
     * @param args
     */
    public static void main(String[] args){

    }
}

对象的适配器模式

不同的是将Source的实例对象作为,Adapter的成员变量

同类的适配器原因

UML 类图:
这里写图片描述

源码(只有Adapter有区别,也就是代理实现的方式有区别)

public class AdapterForObj implements Targetable {

    public Source m_Source;

    public void method1(){

    }

    public void method2(){

    }

}

接口的适配器模式

存在问题:接口定义的方法多了,类都需要实现就麻烦了。
违背原则:接口隔离原则
解决方案:定义抽象类实现接口,客户端调用抽象类

UML 类图:
这里写图片描述

源码:

public abstract class AdapterForInter implements Targetable {

    public void method1(){

    }

    public void method2(){

    }

}

public class Source1 extends AdapterForInter {

    public void method1(){

    }

}

public class Source2 extends AdapterForInter {

    public void method2(){

    }

}

装饰模式

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

存在问题:给一个对象增加一些新的功能
违背原则:开闭原则
解决方案:提供一个装饰类

UML类图:
这里写图片描述

源码:

public interface ISource {

    public void method();

}

public class Source implements ISource {

    public void method(){

    }

}

public class Decorator implements ISource {

    public Source m_Source;

    public void method(){

    }

}

public class Client {

    /**
     * 
     * @param args
     */
    public static void main(String[] args){

    }

}

实现与对象的适配模式类似,但两者的场景完全不同

代理模式

代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做。

原因和装饰一样,实现也是类似。
但是装饰为了修改功能
代理则是为了控制权限,原有的类是对客户端透明的。

UML 类图:
这里写图片描述

源码:

public class Proxy implements ISource {

    public Source m_Source;

    public void doAfter(){

    }

    public void doBefore(){

    }

    public void method(){

    }

}

外观模式

外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度。

UML图:
这里写图片描述

这个理解比较简单,不贴源码了。

桥接模式

桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。

UML图:
这里写图片描述

源码:

public interface Driver {

    public void method();

}

public class MysqlDriver implements Driver {

    public void method(){

    }

}

public class OracleDriver implements Driver {

    public void method(){

    }

}

public class Db2Driver implements Driver {

    public void method(){

    }

}

public class Bridge {

    public Driver m_Driver;

    public void method(){

    }

}

组合模式

又叫部分-整体模式在处理类似树形结构的问题时比较方便

UML 类图
这里写图片描述

源码:

public class TreeNode {

    private String name;
    private TreeNode parent;
    public Vector<TreeNode> m_TreeNode;

    /**
     * 
     * @param treeNode
     */
    public void add(TreeNode treeNode){

    }

    public TreeNode remove(){
        return null;
    }

}

享元模式

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。

UML 类图
这里写图片描述

源码:

public class ConnectionPool {

    public Vector<Connection> m_Connection;

    public Connection getConnection(){
        return null;
    }

    /**
     * 
     * @param connection
     */
    public void release(Connection connection){

    }

}

剩下的行为型的设计模式留待下一篇在讲咯

欲知后事如何,请听下回分解…

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页