`

25、设计模式之结构模式

    博客分类:
  • java
 
阅读更多

结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

 

2.1、Adapter(适配器模式):

 class C继承class A ,以达到A的代码重复利用;就是将class  A 的方法适配到 接口B中去,这种设计模式也是比较常用的;

上面是C继承了A,默认得到了2个方法,这种称为类适配模式,

若C没有继承A而是在C中声明了A为属性变量a,那么在实例C时,interfaceB c=new C();c.a.method2();也实现了和上面一样的功能,这种称为对象适配模式;

因为接口的每个方法,子类都要覆写,这样就造成子类不需要的方法也要去覆写;最好就是在实现类和接口之间增加一个抽象类,这样实现类就可以自由选择自己需要覆写那些方法了,增加灵活性。

比如:

AbstractB  implements  interfaceB{A a;method1(){a.method1();};method2(){a.method2();};method3();method4()}
//采用对象适配模式,加载资源类A的方法;也可采用类适配模式直接继承A加载
class C extends  AbstractB{method3()}
class D extends  AbstractB{method4()}

interfaceB d=new D();
d.method1();
d.method4();
 
 这种称为接口适配模式;个人理解叫"抽象类适配模式"为实现类提供了可以选择性地实现抽象方法,增加编写程序的灵活性;
 
2.2、Decorator(装配器模式)
适配模式是将资源类的方法 加载到接口中去,以供实现类调用;
而装配类可以理解为:选择使用简装版的A和精装版的C(把A装饰了一下)

 这样c.method()就在a.method的基础上增加了其他功能,采用对象适配模式加载方法;为什么不用C直接继承A,然后覆写method?那样的话没有体现复用代码的思想,也没体现装饰的含义,因为覆写就相当于重写做了个功能,装饰是在原功能之上添加点次要功能(比如一个毛坯房需要装饰,不是把拆了 重新建个别墅的意思);
 
 2.3、Proxy(代理模式)
看过前面的类加载器,就知道父类加载器可以代理子类加载器去加载一个.class文件,直至祖先类成功加载为止;在现实生活中,一般你的父母可以代理你完成某些事项,又如你委托律师代理去打官司,又如你委托朋友代理缴纳社保(要提供两人的身份证),又如你要建房子,建筑公司代理你帮你拿到建房许可、房梁室内外设计、分包施工队、分包水电气装修、代办房产证等等。

 从结构上与装配模式相似,只是装配模式一般是没有划分模块功能;而代理模式是有分模块功能的,可以调用模块,利于代码的升级、维护;
 
2.4、Facade(外观模式)

ABCD互相没有依赖关系,实现解耦的目的;如果没有F封装这些方法,而是ABCD互持其它对象,比如B的方法发生了改变,ACD并不知道而继续加载使用,可能会出现程序错误;外观模式只需要通知F:B的某个方法改变了,F采取相应调整就可以了,而原来ACD都需要进行调整;
 
2.5、Bridge(桥接模式)
使用过数据库就会知道有个叫桥连接的概念:
Connection con=null;
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "111122");
//dosomgthing
con.close();
Connection、Driver是java.sql包里定义的两个接口;DriverManager是java.sql包里定义的一个类;如何启动mysql驱动程序的呢?com.mysql.jdbc.Driver是mysql-connector-java.jar里定义的一个类;这里使用了反射机制,照说应该写成Class clazz=Class.forName("com.mysql.jdbc.Driver");
然后在创建实例,再调用实例的某个方法来启动数据库,比如这样:clazz.newInstace().method();  这里看看com.mysql.jdbc.Driver的源码是怎么写的,好像现在下载不到源码,使用反编译器jd-gui查看:
public class Driver extends NonRegisteringDriver{ 
    public Driver() throws SQLException{} 
    static { 
        try{ 
            DriverManager.registerDriver(new Driver());       
        } 
        catch(SQLException E){ 
            throw new RuntimeException("Can't register driver!"); 
        } 
    } 
} 
在Driver的构造方法里声明了static关键字,也就是说在Class.forName的时候,1.构造方法没有执行,2.执行DriverManager.registerDriver方法,3.执行registerDriver为什么里面是new Driver()而不是this呢?
解决这个问题  看我的第2章、类与对象关于方法的执行顺序;因为直接执行了静态块,该对象还没创建一个堆内存空间,this指向的是个null,jvm会报空指针异常;这里查看到NonRegisteringDriver 实现了Driver接口:


再看看DriverManager.registerDriver()这个方法:
 public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver));
         } else {
            throw new NullPointerException();
        }
 执行上一步,就是为连接做好了准备,在DriverManager(驱动器管理者)这里注册登记了,以后就可以使用了; 需要更换数据库只需要更改发射机制提供的地址:
Class.forName("oracle.jdbc.driver.OracleDriver");
public class OracleDriver  implements Driver{... ...}//同样里面也是有static{DriverManager.registerDriver()}方法
 
2.6、Composite(组件模式) 组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便;
2.7、Flyweight(享元模式)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象;又如Java里面的JDBC连接池,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节省了空间,减少了实例的数量。
/*公有属性*/  
    private String url = "jdbc:mysql://localhost:3306/test";  
    private String username = "root";  
    private String password = "root";  
    private String driverClassName = "com.mysql.jdbc.Driver";  
	
private Vector<Connection> pool;
public ConnectionPool(int poolSize) throw Exception{  
        pool = new Vector<Connection>(poolSize);    
        for (int i = 0; i < poolSize; i++) {  
                Class.forName(driverClassName);  
                conn = DriverManager.getConnection(url, username, password);  
                pool.add(conn);    
        }   
}
 通过设置Vector/List集合里的实列数量,来动态实现最大、最小、初始、闲置的数据库连接数量;
下章接着讲解设计模式的行为模式;
 
  • 大小: 104.8 KB
  • 大小: 135.1 KB
  • 大小: 97.1 KB
  • 大小: 137.5 KB
  • 大小: 77 KB
  • 大小: 33.4 KB
分享到:
评论

相关推荐

    软件体系结构设计模式作业

    在IT行业中,软件体系结构设计模式是开发高质量、可维护和可扩展的软件系统的关键要素。设计模式是一种在特定上下文中解决常见问题的最佳实践,它为软件设计提供了可重用的解决方案。本作业将深入探讨软件体系结构...

    软件设计模式与体系结构

    第一篇分为8章,介绍了软件体系结构的基础理论,包括软件体系结构的概念及演化、软件建模基础、软件体系结构的形式化、软件体系结构的风格、体系结构的描述语言、软件质量建模、设计模式等内容。第二篇分为4章,首先...

    JAVA设计模式之结构模式

    这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...

    软件设计模式与体系结构课后习题代码(孙玉山).zip

    在软件开发领域,设计模式和体系结构是至关重要的概念,它们是解决常见问题的模板,为软件的可扩展性、可维护性和可重用性提供了基础。本资源"软件设计模式与体系结构课后习题代码(孙玉山).zip"包含了孙玉山教授讲解...

    软件设计模式与体系结构(期末复习1).rar

    《软件设计模式与体系结构》是软件开发领域中的核心理论之一,它关乎到软件的可维护性、可扩展性和灵活性。这份压缩包“软件设计模式与体系结构(期末复习1).rar”包含了对这一主题的复习资料,特别是对于期末考试...

    设计模式之结构型模式

    本资源是用VC6.0实现的结构型设计模式,主要有BridgePattern、AdapterPattern、DecoratorPattern、CompositePattern、FlyweightPattern、FacadePattern、ProxyPattern六种模式,参考于《23种设计模式(C++).pdf》

    设计模式之蝉

    设计模式通常被划分为三个主要类别:创建型模式、结构型模式和行为型模式。 《设计模式之蝉》这本书可能是对设计模式的一种形象化描述,或是以蝉为比喻来讲解设计模式的概念。蝉在地下蛰伏多年,最终破土而出,仅...

    Java设计模式之结构型模式源码以及文档

    今天我们要探讨的是“Java设计模式之结构型模式”。结构型模式主要关注如何组织类和对象,以达到良好的架构,提升代码的可读性和可维护性。在这个主题中,我们将深入理解并讨论这些模式的原理、应用场景及其实现。 ...

    23种设计模式结构图

    设计模式结构图 在软件开发中,设计模式是一种重要的概念,它帮助开发者更好地设计和实现软件系统。设计模式提供了一种通用的解决方案,可以重复使用,以减少软件开发中的成本和时间。 从给定的文件信息中,我们...

    软件设计模式与体系结构练习题

    在软件开发领域,设计模式和体系结构是至关重要的概念,它们是构建可扩展、可维护且高效软件系统的基础。设计模式是一种在特定情况下解决常见问题的标准化解决方案,而体系结构则是软件系统的整体构造和组织方式。这...

    软件设计模式与体系结构(讲解+代码)

    上篇:软件设计模式例子代码  【例2.2】简单工厂方法模式-汽车保险  【例2.3】工厂方法模式-汽车保险  【例2.4】抽象工厂模式-房屋信息  【例2.5】生成器模式-房屋信息  【例2.6】单例模式-互联网连接  ...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    软件设计模式与体系结构孙云山课后习题234章答案.zip

    孙云山老师的“软件设计模式与体系结构”课程深入探讨了这些模式及其在构建复杂系统中的应用。本资料集合包含了课后习题的第234章答案,这将有助于学生深化对设计模式的理解,并提升其实际应用能力。 设计模式是...

    软件设计模式与体系结构期末课程大作业-服装管理系统

    在软件开发领域,设计模式和体系结构是两个至关重要的概念,尤其在大型项目中,它们对于软件的可维护性、可扩展性和可复用性起着决定性的作用。本项目——“服装管理系统”是一个很好的实践案例,让我们深入探讨其中...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    软件设计模式与体系结构(4)多种模式的代码.rar

    在软件开发领域,设计模式和体系结构是两个至关重要的概念,它们构成了复杂系统的基础和蓝图。本资源聚焦于“软件设计模式与体系结构”,特别是针对Java编程语言的应用,旨在为学习者提供一个全面复习和考研准备的...

    软件设计模式作业+答案

    软件设计模式和软件体系结构知识点总结 software design patterns and software architecture knowledge points summary 创建型软件设计模式: 工厂模式(Factory Pattern):符合开闭原则,提供了一种创建对象的...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    人人都懂设计模式 人人都懂设计模式

    设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中,作者罗伟富通过 Python 实现了 23 种经典设计模式,包括 Singleton 模式、Factory 模式、Observer 模式等。这些模式可以帮助开发者更好地...

Global site tag (gtag.js) - Google Analytics