平凡创造的经典--组合与继承

组合和继承,是很基础的两种设计模式,甚至在没有听说过任何设计模式的时候,就已经用上了这种模式。这两种模式也被称为最基础的设计模式。但是在真实的使用过程中,一些初学者并不能很好的使用这两种设计模式,尤其是在两者混合使用的时候,可能会出现更多的问题。

字面上理解组合和继承,并没有太多的差别。但是如何在设计过程中用简单的理论,创造出经典的设计,又是另外一码事儿了。下面就根据开源的代码,看看高手是如何写代码的。


代码来源:httpclient代码。


整体代码可以从上面提供的地址下载,文中之引用关键代码,只做说清关系的作用。

我们的程序在运行过程中(尤其是有多个线程的时候),通常需要一个上下文来保存运行过程中的中间值和一些配置参数。在不同的情景下,可能需要不同的上下文体。这个时候,如何设计一种扩展性强的上下文实现,就成了一个问题。

首先,我们需要一个HttpClientContext,如何让这个类变得上下可扩展,让我们看看大牛们是怎么写代码的。

public class HttpClientContext extends HttpCoreContext 。其中HttpClientContext是我们在某种情况下需要的一个Context类,为了向上抽象,构建了一个顶层的核心上下文。


下面是httpCoreContext的定义

public class HttpCoreContext implements HttpContext。HttpContext接口,是上下文在使用过程中需要引用的接口。


简单的讲,这样实现了多态,只要重写CoreContext里面的方法,就可以动态的改变Context的功能。但是这样明显显得灵活性不够。因为不同的Context类之间的差别度(差异化的程度)可能不是很大。这样可能会造成很多的冗余代码,并且Context和业务相关,这个在开发及维护方面,显得有一些缺陷。


上面说的是继承,单独的继承,虽然有可扩展性,但是明显的显得不足。


看看下面的代码

public static HttpCoreContext create() {
        return new HttpCoreContext(new BasicHttpContext());
    }


    public static HttpCoreContext adapt(final HttpContext context) {
        Args.notNull(context, "HTTP context");
        if (context instanceof HttpCoreContext) {
            return (HttpCoreContext) context;
        } else {
            return new HttpCoreContext(context);
        }
    }


    private final HttpContext context;


    public HttpCoreContext(final HttpContext context) {
        super();
        this.context = context;
    }


这是HttpCoreContext的几种创建方法,这段代码,起到了相当大的作用

  public HttpCoreContext(final HttpContext context) {
        super();
        this.context = context;
    }


运用组合的方式,大大提高了上下文类的扩展性。这样,如果你想构造一个个性化的上下文,你只需将实现了HttpContext接口的类以参数的形式构造为HttpCoreContext的任意子类即可。如果所需要的上下文类有个性化的方法,只要在拿到上下文之后,进行向下转型即可。这样就大大提高了该上下文的可扩展性。


高手的代码,总让人回味无穷。高手也像武侠小说中那样,将最简单的招式,化腐朽为神奇,以别人想不到的方式,作出独具匠心的设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
毕设新项目基于python3.7+django+sqlite开发的学生就业管理系统源码+使用说明(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 学生就业管理系统(前端) ## 项目开发环境 - IDE: vscode - node版本: v12.14.1 - npm版本: 6.13.4 - vue版本: @vue/cli 4.1.2 - 操作系统: UOS 20 ## 1.进入项目目录安装依赖 ``` npm install ``` ## 2.命令行执行进入UI界面进行项目管理 ``` vue ui ``` ## 3.编译发布包(请注意编译后存储路径) #### PS:需要将编译后的包复制到后端项目的根目录下并命名为'static' 学生就业管理系统(后端) ## 1.项目开发环境 - IDE: vscode - Django版本: 3.0.3 - Python版本: python3.7.3 - 数据库 : sqlite3(测试专用) - 操作系统 : UOS 20 ## 2.csdn下载本项目并生成/安装依赖 ``` pip freeze > requirements.txt pip install -r requirements.txt ``` ## 3.项目MySQL数据库链接错误 [点击查看解决方法](https://www.cnblogs.com/izbw/p/11279237.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值