目录
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类是第三方类,只知方法调用不知方法实现
重写代码没复用