二十三种设计模式第三天:装饰模式和适配器模式

一:装配模式

 用途:当一个类提供的方法不足以满足使用者当前的情况,需要对这些方法做一些功能上的添加但不能修改原始的方法时,这时候就可以使用装饰模式。简而言之,装饰模式用来对一个类做功能的装饰扩展。

来看实现:

首先这里有一个提供了功能的类Offer,等待被装饰

public class Offer implements Decorater{
    public void method(){
        System.out.println("I am the beginning method");
    }
}

我们使它实现Decorater接口,接口中定义了我们将要被扩展功能的方法

public interface Decorater {
    void method();
}

最后创建新的类来进行功能扩展

public class Decorated implements Decorater {
    private Decorater decorater;

    public  Decorated(Decorater decorater){
        this.decorater=decorater;
    }

    @Override
    public void method() {
       decorater.method();
        System.out.println("但是已经被装饰了");
    }
}

测试输出 :

I am the beginning method

但是已经被装饰了

使用场景:

1.扩展某个类的功能

2.动态的为某个对象添加功能,可以不止一个功能。能够随意的动态增加和删除。

二:适配器模式

适配器包括了三种模式,类适配器,接口适配器和对象适配器。它们实现的功能都是将一个类的功能扩展到另一个类中去。

类适配器:

实现原理:我希望把类A的方法A扩充到类B的中去,那么我只需要使类 B实现一个定义了方法A的接口,并继承类A

public class A {
   public void A(){
        System.out.println("方法A");
    }
}


public interface Adapter {
    void A();
    void B();
}


public class B extends A implements Adapter {
    @Override
    public void B() {
        System.out.println("method B");
    }
}

测试

public static void main(String[] args) {
        Adapter adapter=new B();
        adapter.A();
        adapter.B();
    }

测试输出:

实际上,我在IDE中选到方法A ,发现A已经实现了Adapter接口通过B类

对象适配器:

原理大致相同,只是在B中,通过获得了A的实例来获得功能A

修改B代码如下

public class B implements Adapter {
    private A a;
    
    public B(A a){
        this.a=a;
    }


    @Override
    public void A() {
        a.A();
    }

    @Override
    public void B() {
        System.out.println("method B");
    }
}

接口适配器模式:

有些时候,实现一个接口时,目的只是获取其中一部分功能,但是却必须重写所有接口方法。因此,我们在中间引入一个抽象类,通过抽象类来和接口取得联系。

public interface Adapter {
    void A();
    void B();
}

abstract class Bagman implements  Adapter{
    public void A(){};
    public void B(){};
}


public class B extends Bagman {

    @Override
    public void B() {
        System.out.println("method B");
    }

}

这样搞我就只用重写我想要获得的方法。

三种模式的引用场景:

类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个中间抽象类,实现所有方法,我们写别的类的时候,继承抽象类即可。

猜你喜欢

转载自blog.csdn.net/make__It/article/details/81203170
今日推荐