java设计模式(适配器、装饰者、责任链、观察者)

适配器模式:

package com.xiaowei.designpattern;

public class AdapterModeTest {
    /**
     * 适配器模式 模式定义: 将一个类的接口转换成客户希望的另一个接口。
     * Adapter模式使得原来由于接口不兼容而不能一起工作的那些类 可以一起工作。
     * 比如电源转换,220V,电脑、手机、低功率电器的一些适配。 
     * 分两种:对象适配器模式(组合)和类适配器模式(继承)。
     * 应用场景:
     * 1、当你希望使用某些现有类,但其接口与您的其他代码不兼容时,请使用适配器模式;
     * 2、当你希望重用几个现有的子类,这些子类缺少一些不能添加到超类的公共功能时,请使用该模式;
     * 
     * 优点:
     * 1、符合单一职责原则
     * 2、符合开闭原则。
     */
    public static void main(String[] args) {
        // 对象适配器模式,组合
//        Target adapter = new Adapter(new Adaptee());
//        adapter.output5v();
        
        // 类适配器模式,继承
        // 对接口有污染,不符合迪米特原则
        ClassAdapter classAdapter = new ClassAdapter();
        classAdapter.output5v();
    }
}

class Adaptee {
    public int output220v() {
        return 220;
    }
}

interface Target {
    int output5v();
}

/**
 * Object Adapter
 */
class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public int output5v() {
        int output220v = adaptee.output220v();
        System.out.println(String.format("原始电压:  %d    -->   输出电压:  %d", output220v, 5));
        return 5;
    }
}

/**
 * Class Adapter
 */
class ClassAdapter extends Adaptee implements Target {

    @Override
    public int output5v() {
        int output220v = output220v();
        System.out.println(String.format("原始电压:  %d    -->   输出电压:  %d", output220v, 5));
        return 5;
    }
    
}


装饰者设计模式:

package com.xiaowei.designpattern;

public class DecoratorModeTest {
    /**
     * 装饰着模式定义:
     * 在不改变原有对象的基础上,将功能附加到对象上。符合开闭原则。对修改关闭,对拓展开放。
     * 
     * 优点:
     * 1、不改变原有对象的情况下给一个对象扩展功能
     * 2、使用不同的组合可以实现不同的效果
     * 3、符合开闭原则
     */
    public static void main(String[] args) {
        Component component = new ConcreateDecorator2(new ConcreateDecorator1(new ConcreateDecorator()));
        component.operation();
    }
}

interface Component {
    void operation();
}

class ConcreateDecorator implements Component {

    @Override
    public void operation() {
        System.out.println("拍照");
    }
}


abstract class Decorator implements Component {
    // 持有Component引用,才可以对进行装饰
    Component component;
    
    public Decorator(Component component) {
        this.component = component;
    } 
}

class ConcreateDecorator1 extends Decorator {

    ConcreateDecorator1(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("添加美颜效果......");
        component.operation();
    }    
}

class ConcreateDecorator2 extends Decorator {

    public ConcreateDecorator2(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("添加滤镜效果......");
        component.operation();
    }    
}

责任链设计模式:

package com.xiaowei.designpattern;

public class ChainOfResponsibilityModeTest {
    
    /**
     * 责任链模式
     * 模式定义:
     * 1、为请求创建了一个接收者对象的链。
     * 
     * 比如okhttp请求,请求频率、登录认证、访问权限、敏感词过滤。
     * 
     * 应用场景:
     * 一个请求的处理需要多个对象当中的一个或几个协作处理
     * 
     * 优点:
     * 1、请求的发送者和接收者解耦
     * 2、可以控制执行顺序
     * 3、符合开闭原则和单一职责原则
     */
    public static void main(String[] args) {
        Request request = new Request.RequestBuilder().frequentOk(true).loggedOn(false).build();
        RequestFrequentHandler requestFrequentHandler = new RequestFrequentHandler(new LoggingHandler(null));
        if (requestFrequentHandler.process(request)) {
            System.out.println("正常业务处理:");
        } else {
            System.out.println("访问异常:");
        }
    }
}


class Request{
    private boolean loggedOn;
    private boolean frequentOk;
    private boolean isPermits;
    private boolean containsSensitiveWords;
    private String requestBody;

    public boolean isLoggedOn() {
        return loggedOn;
    }
    public void setLoggedOn(boolean loggedOn) {
        this.loggedOn = loggedOn;
    }
    public boolean isFrequentOk() {
        return frequentOk;
    }
    public void setFrequentOk(boolean frequentOk) {
        this.frequentOk = frequentOk;
    }
    public boolean isPermits() {
        return isPermits;
    }
    public void setPermits(boolean isPermits) {
        this.isPermits = isPermits;
    }
    public boolean isContainsSensitiveWords() {
        return containsSensitiveWords;
    }
    public void setContainsSensitiveWords(boolean containsSensitiveWords) {
        this.containsSensitiveWords = containsSensitiveWords;
    }
    public Request(boolean loggedOn, boolean frequentOk, boolean isPermits, boolean containsSensitiveWords) {
        this.loggedOn = loggedOn;
        this.frequentOk = frequentOk;
        this.isPermits = isPermits;
        this.containsSensitiveWords = containsSensitiveWords;
    }
    static class RequestBuilder{
        private boolean loggedOn;
        private boolean frequentOk;
        private boolean isPermits;
        private boolean containsSensitiveWords;
        
        public Request build() {
            return new Request(loggedOn, frequentOk, isPermits, containsSensitiveWords);
        }
        
        RequestBuilder loggedOn(boolean loggedOn) {
            this.loggedOn = loggedOn;
            return this;
        }
        RequestBuilder frequentOk(boolean frequentOk) {
            this.frequentOk = frequentOk;
            return this;
        }
        RequestBuilder isPermits(boolean isPermits) {
            this.isPermits = isPermits;
            return this;
        }
        RequestBuilder containsSensitiveWords(boolean containsSensitiveWords) {
            this.containsSensitiveWords = containsSensitiveWords;
            return this;
        }
    }
}

abstract class Handler {
    Handler next;
    public Handler(Handler next) {
        this.next = next;
    }
    
    public void setNext(Handler next) {
        this.next = next;
    }


    public Handler getNext() {
        return next;
    }
    
    abstract boolean process(Request request);
}

class RequestFrequentHandler extends Handler {

    public RequestFrequentHandler(Handler next) {
        super(next);
    }

    @Override
    boolean process(Request request) {
        System.out.println("访问频率控制:");
        if (request.isFrequentOk()) {
            Handler next = getNext();
            if (null == next) {
                return true;
            }
            if (!next.process(request)) {
                return false;
            } else {
                return true;
            }
        }
        return false;
    }
}

class LoggingHandler extends Handler {

    public LoggingHandler(Handler next) {
        super(next);
    }

    @Override
    boolean process(Request request) {
        System.out.println("登录访问控制:");
        if (request.isLoggedOn()) {
            Handler next = getNext();
            if (null == next) {
                return true;
            }
            if (!next.process(request)) {
                return false;
            } else {
                return true;
            }
        }
        return false;
    }
}

观察者设计模式:

package com.xiaowei.designpattern;

import java.util.ArrayList;

public class ObserverModeTest {
    
    /**
     * 观察者模式:
     * 模式定义:
     * 1、定义了对象的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的
     * 所有的依赖着都会收到这样的通知并更新。
     * 
     * 应用场景:
     * 1、当更改一个对象的状态可能需要更改其他对象,并且实际的对象事先未知或动态更改时请使用观察者模式。
     * 
     * 优点:
     * 1、符合开闭原则
     * 2、可以在运行时建立对象直接的关系
     */
    public static void main(String[] args) {
        Subject subject = new Subject();
        Task1 task1 = new Task1();
        subject.addObserver(task1);
        Task2 task2 = new Task2();
        subject.addObserver(task2);
        subject.notifyObserver("xxxx");
        System.out.println("===================");
        subject.removeObserver(task1);
        subject.notifyObserver("yyyy");
    }
}

class Subject {
    // 容器
    private java.util.List<Observer> container = new ArrayList<>();
    
    // 添加
    public void addObserver(Observer observer) {
        container.add(observer);
    }
    
    // remove
    public void removeObserver(Observer observer) {
        container.remove(observer);
    }
    
    public void notifyObserver(Object object) {
        for (Observer observer : container) {
            observer.update(object);
        }
    }
}

interface Observer{
    void update(Object object);
}

/**
 * 观察者1
 */
class Task1 implements Observer {

    @Override
    public void update(Object object) {
        System.out.println("task1 received : " + object);
    }
}

/**
 * 观察者2
 */
class Task2 implements Observer {

    @Override
    public void update(Object object) {
        System.out.println("task2 received : " + object);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值