5、设计模式之适配器模式/原型模式

开始之前

本章节是一个系列,里面用的的代码实例都是连贯的。在实现某一种设计模式时,为了减少代码篇幅,前面博客出现model类(仅限公用的model类,比如compute、CPU、Mem、Disk等纯对象类)不会重复出现,读者在阅读某一篇博客时,如果发现突然出现了一个新的model类,在本片博客中没有其定义,可以往前面的博客翻一下!

最后,当本系列更新完成后,我会整个的代码完整贴出来,提供下载链接!

适配器模式

使用场景

有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

何时使用

1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

优缺点

优点:

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

缺点:

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

代码实现

现在在之前代码的基础上,之前compute只能读写磁盘Disk,现在想要能够适配读写SD卡。

public abstract class SDCard {

    protected abstract String getName();

    public void readSD(){
        System.out.println(getName()+" readSD");
    }

    public void writeSD(){
        System.out.println(getName()+" writeSD");
    }
}

public class XiaomiSDCard extends SDCard{
    @Override
    protected String getName() {
        return "xiao mi sdcard";
    }
}

适配器需要继承已有的disk类,然后适配新的SD卡类

public class SDCardAdapter extends Disk {

    private final SDCard sdCard;

    public SDCardAdapter(SDCard sdCard) {
        this.sdCard = sdCard;
    }
    @Override
    protected String getName() {
        return "sd card adapter";
    }

    @Override
    public void read() {
        sdCard.readSD();
    }
    @Override
    public void write() {
        sdCard.writeSD();
    }
}
public class Client {
    public static void main(String[] args) {
        System.out.println("正常模式");
        Compute compute = new ComputeBuilder()
                .power(new V220())
                .mem(new XiaomiMem())
                .cpu(new XiaomiCpu())
                .disk(new XiaomiDisk())//需要适配的地方
                .build();
        compute.run();

        System.out.println("适配器模式");
        compute = new ComputeBuilder()
                .power(new V220())
                .mem(new XiaomiMem())
                .cpu(new XiaomiCpu())
                .disk(new SDCardAdapter(new XiaomiSDCard()))//适配器模式
                .build();
        compute.run();
    }
}

原型模式

定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。
简单地理解,其实就是当需要创建一个指定的对象时,我们刚好有一个这样的对象,但是又不能直接使用,我会clone一个一毛一样的新对象来使用;基本上这就是原型模式。关键字:Clone。

深拷贝和浅拷贝

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。clone明显是深复制,clone出来的对象是是不能去影响原型对象的

相关推荐

  1. 5设计模式适配器模式/原型模式

    2024-05-26 01:40:30       11 阅读
  2. 设计模式-适配器模式

    2024-05-26 01:40:30       38 阅读
  3. 设计模式适配器模式

    2024-05-26 01:40:30       19 阅读
  4. 设计模式适配器模式

    2024-05-26 01:40:30       16 阅读
  5. 设计模式适配器模式

    2024-05-26 01:40:30       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-26 01:40:30       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-26 01:40:30       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-26 01:40:30       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-26 01:40:30       20 阅读

热门阅读

  1. 001 mongodb

    2024-05-26 01:40:30       12 阅读
  2. QT--splitter的使用

    2024-05-26 01:40:30       11 阅读
  3. 39. 组合总和 - 力扣(LeetCode)

    2024-05-26 01:40:30       11 阅读
  4. 169. 多数元素

    2024-05-26 01:40:30       9 阅读
  5. 15、Go Gin常见响应返回详解

    2024-05-26 01:40:30       11 阅读
  6. 掌握C++回调:按值捕获、按引用捕获与弱引用

    2024-05-26 01:40:30       12 阅读
  7. 【数据结构与算法 | 基础篇】数组模拟栈

    2024-05-26 01:40:30       12 阅读
  8. 银发经济:老龄化社会中的机遇与挑战

    2024-05-26 01:40:30       10 阅读