适配器模式

目录

https://blog.csdn.net/dongganen/article/details/79688794

定义适配器模式


将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

案例分析


小兔子搞了一个群羊party,邀请所有镇上的羊来参加,大灰狼也想来,那他该怎么办呢?

代码实现


public class Part1 {

    public static void main(String[] args) {
        Rabbit rabbit = new Rabbit();

        //绵羊来参加
        Mutton mutton = new Mutton();
        rabbit.welcomeToParty(mutton);

        //山羊来参加
        Goat goat = new Goat();
        rabbit.welcomeToParty(goat);

        //大灰狼来参加,不让进
        TimberWolf timberWolf = new TimberWolf();

        //披着羊皮的狼
        SheepskinWolf sheepskinWolf = new SheepskinWolf(timberWolf);
        rabbit.welcomeToParty(sheepskinWolf);

    }
}

//兔子
class Rabbit{

    public void welcomeToParty(Sheep sheep){
        System.out.println("欢饮参加全羊party");
        //叫几声表示很开心
        sheep.shout();
    }
}

//羊
abstract class Sheep{
    //外观
    public abstract void display();
    //羊叫
    void shout(){
        System.out.println("咩咩");
    }
}

//绵羊
class Mutton extends Sheep{
    String name;
    public Mutton(){
        this.name = "绵羊";
    }

    @Override
    public void display() {
        System.out.println("白色");
    }
}

//山羊
class Goat extends Sheep{
    String name;
    public Goat(){
        this.name = "山羊";
    }
    @Override
    public void display() {
        System.out.println("白色");
    }
}

//狼
abstract class Wolf{
    //外观
    public abstract void display();
    //吼叫
    void roar(){
        System.out.println("嗷嗷, 我要吃了你们");
    }
}

//大灰狼
class TimberWolf extends Wolf{

    String name;
    public TimberWolf(){
        this.name = "大灰狼";
    }
    @Override
    public void display() {
        System.out.println("灰色");
    }
}

//披着羊皮的狼
class SheepskinWolf extends Sheep{

    TimberWolf timberWolf;

    SheepskinWolf(TimberWolf timberWolf){
        this.timberWolf = timberWolf;
    }

    @Override
    public void display() {
        System.out.println("披上羊皮我变成了一只羊");
    }

    @Override
    void shout() {
        timberWolf.roar();
    }
}

UML

这里写图片描述

使用场景


在我们现实开发过程中,A类有个方法接收B类对象,使用B类型行为

现在随着需求的变更,A类原来的方向最好使用C类的实现

有什么解决方案呢?

1.A类方法修改,把原来B类实现都改成C类的实现

2.修改B类,把B类原来的逻辑改成C类,或持有C类的应用,调用C类的方法

3.重新实现的B类型的实现拥有个C类相同的功能

问题?

第一种解决方案:

A类这个方法很复杂,改起来很不方便,容易出错

第二种解决方案:

在程序中其他地方引用B原来的实现,不太推荐

第三种解决方案:

C类是第三方类,只知方法调用不知方法实现

重写代码没复用

参考《Head First 设计模式》

阅读更多
个人分类: 设计模式
上一篇命令模式
下一篇java图片上传
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭