一:装配模式
用途:当一个类提供的方法不足以满足使用者当前的情况,需要对这些方法做一些功能上的添加但不能修改原始的方法时,这时候就可以使用装饰模式。简而言之,装饰模式用来对一个类做功能的装饰扩展。
来看实现:
首先这里有一个提供了功能的类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类的方法中,调用实例的方法就行。
接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个中间抽象类,实现所有方法,我们写别的类的时候,继承抽象类即可。