🌐 设计模式及源码分析(三)

四、结构性模式介绍

4.1 适配器模式(Adapter Pattern)

当我们需要在现有系统中使用一个类,但是这个类的接口与系统的要求不符合时,适配器模式就可以发挥作用。适配器模式通过引入一个中间件(适配器)来转换原始类的接口,使得原始类可以与系统进行适配。能够帮助解决不同接口之间的兼容性问题,提高系统的可维护性和可扩展性。

适配器模式的角色有:

  • 目标(Target)接口
  • 适配者(Adaptee)类
  • 适配器(Adapter)类

4.1.1 类结构性适配器

场景

一个帅哥用华为手机看动物世界,一只小狗如何才能听懂华为手机的再讲什么呢,这时候就需要一个翻译功能,把人类的语言翻译成小狗的语言

1.定义一个接口 Talk 、以及实现类 HuaWeiPhone (手机播放的汉语)

java 复制代码
public interface Talk {

    String talk();
}

public class HuaWeiPhone implements Talk {
    @Override
    public String talk() {
        System.out.println("手机--小狗翻译");
        String content = "你在狗叫什么";
        System.out.println(content);  
        return content;
    }
}

2.定义一个接口 Translator 、实现类 DogTalkTranslator (将汉语转换为狗语)

java 复制代码
public interface Translator {
    String translate(String content);
}

public class DogTalkTranslator implements Translator{
    @Override
    public String translate(String content) {
        if("你在狗叫什么".equals(content)){
            return "汪汪汪汪汪汪";
        }
        if ("走开".equals(content)){
            return "汪汪";
        }
        return "--------";
    }
}

3.定义一个适配器类DogTalkAdapter

java 复制代码
public class DogTalkAdapter extends DogTalkTranslator implements Talk {

    private Talk target;//被适配对象

    public DogTalkAdapter(Talk target){
        this.target = target;
    }

    @Override
    public String talk() {

        String talk = target.talk();
        //将汉语转化为狗语
        String translate = translate(talk);
        System.out.println("狗语:"+translate);
        return talk;
    }
}

4.测试类测试

java 复制代码
public class MainTest {

   public static void main(String[] args) {

       HuaWeiPhone huaWeiPhone = new HuaWeiPhone();
       DogTalkAdapter dogTalkAdapter = new DogTalkAdapter(huaWeiPhone);

       huaWeiPhone.talk();
       dogTalkAdapter.talk();


   }
}

4.1.2 对象结构性适配器

1.定义一个适配器DogTalkAdapter (这里通过组合在对象的形式)

Java 复制代码
public class DogTalkAdapter implements Talk {

    //组合的方式
    private Translator translator = new DogTalkTranslator();
    private Talk target;//被适配对象
    public DogTalkAdapter(Talk target){
        this.target = target;
    }

    @Override
    public String talk() {

        String play = target.talk();
        //转换语言
        String translate = translator.translate(play);
        System.out.println("狗语:"+translate);
        return play;
    }
}

2.测试类测试

java 复制代码
public class MainTest {
    public static void main(String[] args) {

        DogTalkAdapter adapter = new DogTalkAdapter(new HuaWeiPhone());
        adapter.talk();
    }

}

4.2 桥接模式(Bridge Pattern)

它将抽象部分与它的实现部分分离开来,使它们都可以独立地变化。这种模式就像一座桥,连接了两个不同的部分,让它们可以相互协作

------------------------------------场景模拟------------------------------------

假如有一个帅哥,他在德国和英国都有一栋房子,那么他可以选择骑自行车或者骑摩托车去,这时候的摩托车还有自行车就相当于一个连接方法,将帅哥和房子通过某种方式连接到一起

------------------------------------代码实现------------------------------------

1.定义 两个工具类 Bicycle 、 Motorcycle

java 复制代码
public class Bicycle extends AbstractVehicle {
    @Override
    String getHome() {
        return "自行车:"+traffic.getTrafficInfo();
    }
}


public class Motorcycle extends AbstractVehicle {

    @Override
    String getHome() {
        return "摩托车:"+traffic.getTrafficInfo();
    }
}

2.定了两个目的地England 、Germany

java 复制代码
public class England extends AbstractTraffic {
    public England(String speed, String time) {
        super(speed, time);
    }
}

public class Germany extends AbstractTraffic {
    public Germany(String speed, String time) {
        super(speed, time);
    }
}

3.定义一个抽象类AbstractTraffic (定义了车辆的速度和时间)

java 复制代码
public abstract class AbstractTraffic {

    private String speed;
    private String time;
    public AbstractTraffic(String speed, String time){
        this.speed = speed;
        this.time = time;
    }

    String getTrafficInfo(){
        return "速度:"+ speed +"==>"+"时间:"+ time;
    }


}

4.定义一个抽象类AbstractVehicle (桥接的地方)

java 复制代码
public abstract class AbstractVehicle {

    AbstractTraffic traffic; //分离渠道【桥接的关注点】
    abstract String getHome();

    public void setTraffic(AbstractTraffic traffic) {
        this.traffic = traffic;
    }
}

5.测试类测试

Java 复制代码
public class MainTest {

    public static void main(String[] args) {
        
        Motorcycle motorcycle = new Motorcycle();
        motorcycle.setTraffic(new Germany("180km/h","99分钟"));
        System.out.println(motorcycle.getHome());

        motorcycle.setTraffic(new England("180km/h","88分钟"));
        System.out.println(motorcycle.getHome());


        Bicycle bicycle = new Bicycle();
        bicycle.setTraffic(new Germany("160km/h","77分钟"));
        System.out.println(bicycle.getHome());

        bicycle.setTraffic(new England("160km/h","66分钟"));
        System.out.println(bicycle.getHome());


    }
}
相关推荐
wuminyu30 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
小码哥_常44 分钟前
Spring Boot:别再重复造轮子,这些内置功能香麻了
后端
皮皮林5511 小时前
OpenFeign 首次调用卡 3 秒?八年老开发扒透 5 个坑,实战优化到 100ms!
后端
callJJ2 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
kyriewen2 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
千寻girling3 小时前
《 Git 详细教程 》
前端·后端·面试
wbs_scy3 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
0xDevNull4 小时前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
GetcharZp4 小时前
告别 Nginx 手动配置!这款 Go 语言开发的云原生网关,才是容器化时代的真香神器!
后端
jinanwuhuaguo4 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw