在学设计模式(结构型模式)

结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。
结构型模式可以分为类结构型模式和对象结构型模式,也可分为代理模式(Proxy)、适配器模式(Adapter)、桥接模式(Bridge)、装饰模式
(Decorator )、外观模式(Facade)、享元模式(Flyweight)和组合模式(Composite)等 7 类

简单来说就是结构型 像一个大的框架把类和对象互相搭配 引入 继承 各种这种结构能完成一种功能 比如代理模式 装饰器模式 就把每一种结构型模式当成一种更支持扩展性 可用性的框架吧 只要使用这个设计模式就能拥有这个框架带给你的功能
比如代理模式可以对所有对象进行相同的流程控制
装饰模式 可以在外部加强功能

结构型模式重点考虑类或对象的布局方式,其目的是将现有类或对象组成更大的结构。按照其显示方式的不同,结构型模式可分为类结构型模式和对象结构型模式。前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象。

由于组合关系和或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性

1–点击阅读网站教程

2—围观设计模式–作者感悟

3—详细总结

4—工程师总结

代理模式

https://blog.csdn.net/benbenxiongyuan/article/details/23337669

一直以为代理模式只是一种增强真实角色功能类似AOP
原来还有延迟创建对象

因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似

  • 有的时候创建完对象之后并不一定就会直接调用它的方法,甚至直到被回收也没有调用,那么这时候代理模式很显然的效率更高,
  • 再者就是推迟了对象的创建时间,保障前面的程序运行流畅的,减少对象在内存中的存活时间,宏观上减少了内存的消耗。
  • 延迟加载(懒加载),也就是,当一个对象关联着另一个对象的时候,默认是不被直接加载的,它会获得一个代理对象,等到真正调用的时候,这个对象才真正的被创建

在这里插入图片描述
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。它是给某一个对象提供一个替代者(占位者),使之在client对象和subject对象之间编码更有效率。代理可以提供延迟实例化(lazy instantiation),控制访问, 等等,包括只在调用中传递。

在这里插入图片描述
https://blog.csdn.net/u014590757/category_7480482.html?spm=1001.2014.3001.5482

在使用动态代理时,我们需要定义一个位于代理类与委托类之间的中介类,这个中介类被要求实现InvocationHandler接口,一定能提供的功能有

public class MyInvocationHandler implements InvocationHandler {
    private Object trueRole;

    public void setTrueRole(Object trueRole) {
        this.trueRole = trueRole;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        qianyue();
        Object res = null;
        res = method.invoke(trueRole, args);
        money();
        return res;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), trueRole.getClass().getInterfaces(), this);
    }

    private void qianyue() {
        System.out.println("经纪人签约");
    }

    private void money() {
        System.out.println("公司财务收钱");
    }
}

在这里插入图片描述
\cglib 的形式 为没有是实现接口的类创建代理类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

适配器模式

实现方式:
1.适配器与被适配接口是继承关系在这里插入图片描述

2.适配器内组合被适配接口 组合不需要继承
在这里插入图片描述
https://blog.csdn.net/u010288264/article/details/53835185

https://blog.csdn.net/w1033162186/article/details/50635348

适配器模式的客户端 在访问的时候 不声明adpter而是用targert去
在这里插入图片描述

桥接模式

在这里插入图片描述
https://guisu.blog.csdn.net/article/details/7529194

将行为与实体分离开 里面的毛笔的例子生动的说明了 如果不能拆分就无法使用桥接模式

作者是要举例这种解耦的额概念 蜡笔无法解耦就无法使用这种模式
毛笔 从前来写 可能会写一个颜色类 一个型号类 一个毛笔类 然后用构造函数把前两个以属性写进去 那是因为可以用string int来代表这两个属性 可见的多写了一个毛笔类

如果是B站子烁举例的 燕窝类 销售渠道类 两个可以解耦 如果再像从前写毛笔一样写一个综合大类把燕窝和销售渠道包含进去 那造成类的浪费 所以使用桥接模式
解耦 让销售渠道类变为实现接口 而燕窝类只需要引入即可

装饰器模式

继承和组合的区别

一直都说组合比继承好 原来组合比继承还要松耦合 可扩展 封装性好 一直以为是反过来的
继承的耦合已经把方法都耦合进来了 组合只是耦合了对象 可扩展可以多加很多局部对象 实现更多功能

在这里插入图片描述
装饰器模式: 动态地给一个对象添加一些额外的职责或者行为。就增加功能来说, Decorator模式相比生成子类继承父类再添加新功能更为灵活
装饰器模式在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
就好像B站讲的给一个机器人外面套上了一个盒子在盒子上放腿和手 机器人就会跳舞了 也没有改变机器人本身

  • component产品需要那些功能 抽象类/接口类 就是定义API功能的类
    在这里插入图片描述

  • 具体组件角色(ConcreteComponent): 实现上面接口/抽象方法的类
    在这里插入图片描述

  • 抽象装饰器(Decorator): 抽象的类/接口 内部包含一个compnent(被装饰者)实例 1
    可以扩展功能
    在这里插入图片描述
    上面这个图是简单演示没有写上具体的装饰器子类 只是到装饰器这里就截至
    正常是会有更多的子类实现装饰器类然后扩展功能的

  • 具体装饰器角色(ConcreteDecorator):实现或继承装饰器的类 可以有多个,每一个里面也都维护一个组件实例 也可以super(组件实例) 不同的具体装饰器进行对组件的功能不同的扩展

  • 对于客户端 仍旧调用最初的组件功能类 其实功能已经从具体组件角色的功能
    被装饰器装饰的更加多彩了 客户端创建具体的装饰器角色 进行
    创建装饰器把具体组件实现类装进去就可以了
    在这里插入图片描述
    想要扩展功能不用修改原组件(违反开闭原则)
    也不用生成继承的子类(造成类的深度过深)和大量父子类代码的重复
    扩展新功能使用装饰器进行扩展就可以
    改善旧功能使用具体装饰器类进行改善

装饰器和代理模式的区别

装饰器模式是使用的调用者从外部传入的被装饰对象(coffee),调用者只想要你把他给你的对象装饰(加强)一下。而代理模式使用的是代理对象在自己的构造方法里面new的一个被代理的对象,不是调用者传入的

代理模式注重的是对对象的某一功能的流程把控和辅助,它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何(AOP)。
而装饰模式注重的是对对象功能的扩展,不关心外界如何调用,只注重对对象功能加强,装饰后还是对象本身。

代理模式在代理类已经写好了怎么把控 被代理类的功能 编译时定了
装饰器模式 是在客户端调用的时候 把装饰器真实角色的功能加强到原角色上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值