首页 > 其他 > 详细

设计模式-结构型模式

时间:2019-12-30 13:24:21      阅读:96      评论:0      收藏:0      [点我收藏+]

一、适配器模式

适配器模式通过定义一个适配器类作为两个不兼容的接口之间的桥梁,将一个类的接口转换成用户期望的另一个接口,使得两个或多个原本不兼容的接口可以基于适配器类一起工作。

适配器的实现主要分为三类:类适配器模式、对象适配器模式和接口适配器模式。

1、类适配器模式

在不改变原来接口或类结构的情况下扩展类的功能以适配不同的接口时,可以使用类的适配器模式。

技术分享图片

 

(1)定义Source类:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class Source {
    private final static Log logger = LogFactory.getLog(Source.class);
    public void editTextFile(){
        logger.info("a text file editing");
    }
}

(2)定义Targetable接口:

public interface Targetable {
    void editTextFile();
    void editWordFile();
}

(3)定义Adapter继承Source类并实现Targetable接口:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Adapter extends Source implements Targetable {
    private final static Log logger = LogFactory.getLog(Adapter.class);
    @Override
    public void editWordFile() {
        logger.info("a word file editing");
    }
}

(4)使用类适配器:

public class Main {
    public static void main(String[] args) {
        Targetable targetable = new Adapter();
        targetable.editTextFile();
        targetable.editWordFile();
    }
}

结果:

十二月 29, 2019 9:59:42 下午 com.jzq.sign.Adapter.Source editTextFile
信息: a text file editing
十二月 29, 2019 9:59:43 下午 com.jzq.sign.Adapter.Adapter editWordFile
信息: a word file editing

2、对象适配器模式

对象适配器模式的思路与类适配器模式基本相同,只是Adapter不再继承Source类,而是持有Source类的实例。

技术分享图片

 

(1)定义Source类:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class Source {
    private final static Log logger = LogFactory.getLog(Source.class);
    public void editTextFile(){
        logger.info("a text file editing");
    }
}

(2)定义Targetable接口:

public interface Targetable {
    void editTextFile();
    void editWordFile();
}

(3)适配器类定义:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ObjectAdapter implements Targetable {
    private final static Log logger = LogFactory.getLog(ObjectAdapter.class);
    private Source source;
    public ObjectAdapter(Source source){
        super();
        this.source = source;
    }

    @Override
    public void editTextFile() {
        this.source.editTextFile();
    }

    @Override
    public void editWordFile() {
        logger.info("a word file editing");
    }
}

(4)使用类适配器:

public class Main {
    public static void main(String[] args) {
        Source source = new Source();
        Targetable targetable = new ObjectAdapter(source);
        targetable.editTextFile();
        targetable.editWordFile();
    }
}

结果:

十二月 30, 2019 10:45:08 上午 com.jzq.sign.Adapter.ObjectAdapter.Source editTextFile
信息: a text file editing
十二月 30, 2019 10:45:08 上午 com.jzq.sign.Adapter.ObjectAdapter.ObjectAdapter editWordFile
信息: a word file editing

3、接口适配器模式

在不希望实现一个接口中所有方法时,可以创建一个抽象类AbstractAdapter实现所有方法,在使用时继承该抽象类按需实现方法即可。

 技术分享图片

 

(1)定义公共接口Sourceable:

public interface Sourceable {
    void editTextFile();
    void editWordFile();
}

(2)定义抽象类AbstractAdapter并实现公共接口方法:

public abstract class AbstractAdapter implements Sourceable {
    @Override
    public void editTextFile(){}

    @Override
    public void editWordFile(){}
}

(3)定义SourceSub1类按照需求实现editTextFile方法:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class SourceSub1 extends AbstractAdapter {
    private final static Log logger = LogFactory.getLog(SourceSub1.class);
    @Override
    public void editTextFile(){
        logger.info("a text file editing");
    }
}

(4)定义SourceSub2类按照需求实现editWordFile方法:

public class SourceSub2 extends AbstractAdapter {
    private final static Log logger = LogFactory.getLog(SourceSub2.class);
    @Override
    public void editWordFile(){
        logger.info("a word file editing");
    }
}

(5)使用接口适配器:

public class Main {
    public static void main(String[] args) {
        Sourceable source1 = new SourceSub1();
        Sourceable source2 = new SourceSub2();
        source1.editTextFile();
        source2.editWordFile();
    }
}

结果:

十二月 30, 2019 11:01:04 上午 com.jzq.sign.Adapter.AbstractAdapter.SourceSub1 editTextFile
信息: a text file editing
十二月 30, 2019 11:01:04 上午 com.jzq.sign.Adapter.AbstractAdapter.SourceSub2 editWordFile
信息: a word file editing

 

 

 

 

 

二、桥接模式

 

三、过滤器模式

 

四、组合模式

 

五、装饰器模式

 

六、外观模式

 

七、享元模式

 

八、代理模式

设计模式-结构型模式

原文:https://www.cnblogs.com/strong-FE/p/12116784.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!