单例模式,代理模式,观察者模式,模板模式代码实例

简介: 单例模式,代理模式,观察者模式,模板模式代码实例

设计模式


1.单例模式


public class SingonDemo {
    private static SingonDemo singonDemo = new SingonDemo();
   private SingonDemo(){
   }
   public static SingonDemo getInstance(){
       return singonDemo;
   }
    public static void main(String[] args) {
        SingonDemo singonDemo1 = SingonDemo.getInstance();
        SingonDemo singonDemo2 = SingonDemo.getInstance();
        System.out.println(singonDemo1==singonDemo2);
    }
}


2.代理模式


代理模式可以在不改变源代码的情况下对目标对象进行访问控制和功能扩展


目标对象(RealSubject) 实际完成功能的对象


代理对象(Proxy)是目标对象的替身,用户和RealSubject的交互必须通过Proxy。


1.代理对象完成前置工作


2.目标对象完成实际工作


3.代理对象完成后置工作


public interface Subject {
    void work();
}


public class RealSubject implements Subject {
    @Override
    public void work() {
        System.out.println("RealSubject work");
    }
}


public class ProxySubject implements Subject{
    private RealSubject realSubject ;
    public ProxySubject() {
        realSubject = new RealSubject();
    }
    @Override
    public void work() {
        System.out.println("before work");
        realSubject.work();;
        System.out.println("after work");
    }
    public static void main(String[] args) {
        Subject proxySubject = new ProxySubject();
        proxySubject.work();
    }
}

66ba272a0bfc97be54a5fa679e3d5482.png

Prxoy和RealSubject类都实现了Subject接口。这样用户就可以像处理RealSubject一样处理Proxy对象;用户与RealSubject的交互都必须通过Proxy,任何用到RealSubject的地方,都可以用Proxy取代,RealSubject是真正做事的对象。Proxy可以对RealSubject进行访问控制和功能扩展。


创建RealSubjct对象,通常由Proxy负责。


Proxy持有对RealSubject的引用。所以必要时可以将请求转发给RealSubject.


3.观察者模式


观察者模式就是发布订阅模式,发布者发布消息后,订阅者就可以得到消息通知。


发布者


抽象的观察者


具体的观察者


举例:有一个气象站,每天会给观察者推送天气预报


//天气数据
public class WeatherData {
    //温度
    private int temperature;
    //湿度
    private int windPower;
    public WeatherData() {
    }
    public WeatherData(int temperature, int windPower) {
        this.temperature = temperature;
        this.windPower = windPower;
    }
    public int getTemperature() {
        return temperature;
    }
    public void setTemperature(int temperature) {
        this.temperature = temperature;
    }
    public int getWindPower() {
        return windPower;
    }
    public void setWindPower(int windPower) {
        this.windPower = windPower;
    }
}


//抽象的观察者
public interface WeatherObserve {
    //更新天气数据
    void update(WeatherData data);
}


public class RealObserve implements WeatherObserve{
    private String name;
    public RealObserve(String name) {
        this.name = name;
    }
    @Override
    public void update(WeatherData data) {
        System.out.println("ttemperature==="+data.getTemperature());
        System.out.println("windPower===="+data.getWindPower());
    }
}


public class WeatherStation {
    public WeatherObserve[] observes = new WeatherObserve[10];
    private int count = 0;
    public WeatherStation() {
    }
    //添加观察者 对象订阅
    public void registerObserve(WeatherObserve observe) {
        if (count <= 9) {
            observes[count] = observe;
            count++;
        }
    }
    //发布订阅
    public void noticeObserve(WeatherData data) {
        for (int i = 0; i < count; i++) {
            observes[i].update(data);
            System.out.println("==========发布成功===========");
        } 
    }
}


public class Test {
    public static void main(String[] args) {
        WeatherStation weatherStation = new WeatherStation();
        weatherStation.registerObserve( new RealObserve("observe1"));
        weatherStation.registerObserve(new RealObserve("observe2"));
        weatherStation.registerObserve(new RealObserve("observe3"));
        WeatherData weatherData = new WeatherData(10, 2);
        weatherStation.noticeObserve(weatherData);
    }
}


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


4.模板模式


模板模式就是预先定义一个模板,这个模板包含了一些通用的功能,而加你个某些特定的实现交给子类或者接口来完成。


去银行办理业务:


任何办理的业务都需要:


1.排号 2 办理具体的业务 3.评价


①使用抽象类的模板模式


public abstract class BankBusinessTemplate {
    //取号
    protected long takeNumber(){
        int r = (int) (Math.random() * 1000);
        long number = System.currentTimeMillis() + r;
        return number;
    }
    //保存客户反馈
    protected void saveEvaluation(long number, String evaluation){
        System.out.println("号码: "+ number+ "的评价是: "+ evaluation);
    }
    //具体的业务,声明抽象方法,交给子类来做
    protected abstract  String doAction(long number);
    //业务流程
    public void business(){
        long nunmber = takeNumber();
        String evaluation = doAction(nunmber);
        saveEvaluation(nunmber, evaluation);
    }
}


public class NewCard extends BankBusinessTemplate {
    @Override
    protected String doAction(long number) {
        System.out.println("办理开卡业务");
        return "五星好评";
    }
}


public class LossCard extends BankBusinessTemplate {
    @Override
    protected String doAction(long number) {
        System.out.println("办理挂失的业务");
        return "四星好评";
    }
}


public class BankTemplateTest {
    public static void main(String[] args) {
        NewCard newCard = new NewCard();
        newCard.business();
        LossCard lossCard = new LossCard();
        lossCard.business();
    }
}


5d4c6812c8535adbb050f4ddf2e1bce8.png


②使用接口的模板模式


public interface Action {
    /**
     * 办理实际业务
     * @param number
     * @return
     */
    public String doAction(long number);
}


public class LossCard implements Action {
    @Override
    public String doAction(long number) {
        System.out.println("办理挂失的业务");
        return "四星好评";
    }
}


public class NewCard implements Action  {
    @Override
    public String doAction(long number) {
        System.out.println("办理开卡业务");
        return "五星好评";
    }
}


public  class BankBusinessTemplate {
    //取号
    protected long takeNumber(){
        int r = (int) (Math.random() * 1000);
        long number = System.currentTimeMillis() + r;
        return number;
    }
    //保存客户反馈
    protected void saveEvaluation(long number, String evaluation){
        System.out.println("号码: "+ number+ "的评价是: "+ evaluation);
    }
    //业务流程
    public void business(Action action){
        long nunmber = takeNumber();
        String evaluation = action.doAction(nunmber);
        saveEvaluation(nunmber, evaluation);
    }
}


public class BankTemplateTest {
    public static void main(String[] args) {
        BankBusinessTemplate bankBusiness = new BankBusinessTemplate();
        Action action1 = new NewCard();
        bankBusiness.business(action1);
        Action action2 = new LossCard();
        bankBusiness.business(action2);
    }
}


1dc618a0ed9580ce8bfa6facb208c08f.png

代码下载:

https://github.com/hufanglei/daily-code


相关文章
|
3月前
|
设计模式 算法
工厂模式与策略模式的区别
【8月更文挑战第22天】
45 2
工厂模式与策略模式的区别
|
3月前
|
设计模式 Java 数据安全/隐私保护
装饰器模式与观察者模式的区别
【8月更文挑战第24天】
27 0
|
3月前
|
设计模式 Java 开发者
装饰器模式和观察者模式的区别
【8月更文挑战第24天】
29 0
|
5月前
|
设计模式 Oracle Java
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
【6月更文挑战第20天】工厂模式简化对象创建,根据参数或条件生成MySQL或Oracle数据库连接。`DatabaseConnectionFactory`作为工厂,动态返回具体连接类型。装饰器模式则用于运行时动态增加对象功能,如`LoggingDecorator`为`Runnable`对象添加日志记录,保持代码整洁。在`Main`类中展示了如何使用这两种模式。
42 6
|
6月前
|
设计模式 算法
设计模式思考,简单工厂模式和策略模式的区别?
设计模式思考,简单工厂模式和策略模式的区别?
|
6月前
|
设计模式
【设计模式】单例模式的三种实现方式
【设计模式】单例模式的三种实现方式
39 1
|
6月前
|
设计模式 算法 自动驾驶
常见的设计模式(模板与方法,观察者模式,策略模式)
随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改软件,如果不涉及好各个模块的关系,就会导致软件系统难以维护,从而导致软件变得不可使用。面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系
101 2
|
设计模式 算法 Java
模板模式【Java设计模式】
模板模式【Java设计模式】
47 0
|
设计模式 JavaScript 前端开发
设计模式之构造函数模式
设计模式之构造函数模式
72 0
|
设计模式 Java
Java设计模式解析:观察者模式的应用和实例
Java设计模式解析:观察者模式的应用和实例