设计模式之结构型模式(5种)

目录

结构型模式(Structural Pattern):怎么构造一个对象(行为、属性)

一、适配器模式

          二、桥接模式(Bridge)

三、装饰者模式

        设计模式在JAVA I/O库中的应用

案例

        使用前

        使用后

总结: 

四、外观模式

案例

使用前 

使用后

总结:

五、代理模式

分类: 

静态代理

Cglib代理 ​

 总结

jdk代理与Cglib代理比较:

应用


结构型模式(Structural Pattern):怎么构造一个对象(行为、属性)

  1. 适配器模式   Adapter Pattern
  2. 桥接模式    Bridge  Pattern
  3. 组合模式   Composite  Pattern
  4. 装饰模式  Decorator  Pattern
  5. 外观模式   Façade  Pattern
  6. 享元模式   Flyweight  Pattern
  7. 代理模式    Proxy  Pattern

一、适配器模式

适配器介绍:
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
适配器模式的定义:
把一个类的接口变成客户端所期待的另一个接口,使本来不不匹配二无法再一起工作的类可以在一起工作。
使用场景

SpringMvc框架中HandlerAdapter类
1)系统需要使用现有的类,而类的接口不符合要求
2)需要建立一个可以重复使用的类,用于一些彼此之间没有太大关联的类
3)需要一个统一的接口,而输入类型不确定

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

案例:

需求:

电源适配的项目,要让手机能够使用220V的交流电;注意,手机只接受5.5V的电压;

  • 术语

    • source:待适配的类/对象/接口

    • Adapter:适配器

    • destination:适配后可用的类/对象/接口

  • 角色

    • sourcePower220V===》220V的电源

    • AdapterPowerAdapt===》电源适配器

    • DestinationPower5V===》5V的电源

  • 分类

    • 类适配器模式Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配。

    • 对象适配器模式将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实例,以解决兼容性的问题。 即:持有 source 类,实现 Destination 类接口,完成source->Destination 的适配

    • 接口适配器模式当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求 适用于一个接口不想使用其所有的方法的情况

适配器模式分类三种体现形式思想都大同小异,这里就只介绍最常用的 对象适配器模式;

举例二:假如我们要做一个下单操作,需要两个表 Order 订单 orderItem 订单项目=》需要写两个方法OrderDao.add(order)\OrderItemDao.add(oi);但是在某一些例子中,前台传递待后台的是order,而后台需要使用的却是OrderHis,所以这里要使用到我们的适配器。

 示例代码:

package com.javaxl.design.adapter.before;

/**
 * @author 周大福ye
 * @site www.javaxl.com
 * @company
 * @create  2020-02-22 15:51
 *
 * 220V的电压
 */
public class Voltage220V {
    private double voltage;

    public Voltage220V() {
        this.voltage = 220;
    }

    public double getVoltage() {
        return voltage;
    }

    public void setVoltage(double voltage) {
        this.voltage = voltage;
    }
}

 方法中参数的Voltage220V voltage220V是不合理的,应该是适配器

例如:Person人:吃饭、睡觉、休息

       Dog 狗:吃饭、睡觉、休息

人和狗的习惯大致相似,那么Dog能不能继承Preson呢?答案:看似正确,但是不合理,上述方法中也是同理。

public class Phone {
//    充电
    public void charge(Voltage220V voltage220V){
        double voltage = voltage220V.getVoltage() / 40;
        System.out.println("最终手机充电所用电压:" + voltage + "V");
    }
}
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
//        已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
//        还一种方案:新增5V的一个Voltage5V,Voltage的电压可以被手机使用
//        但是这违背现实生活现象,现实生活中只有220V的电源,其他的电源都是通过适配得来的
 
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值