本文主要是介绍春节假期过一半了,慌不慌?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不知不觉春节假期过一半了,马上接近尾声了,不知道大家假期过得怎么样,可能都吃胖了几斤,又被长辈唠叨了几句,给家里小辈发了红包,自己也收到了红包?应该是一片祥和吧。
没有回家的我,选择了待在这个有这王者之气的帝都,过得也还阔以吧。
不同人对待假期倒计时有不同的想法。
有些人可能着急去上班,因为他是资本家,等着打工人给他赚钱呢。
有些人可能抵触上班,因为他是打工人,天天被买办欺负。
有些人可能无所谓,因为工作也很轻松,还有很多同事可以一起,很happy.
那我们就根据面对假期时的不同反应,来讲一个设计模式——观察者模式
一、 是什么
观察者模式,是指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
这种模式也叫:发布—订阅模式、模型-视图模式。
它长这样:
Subject:
抽象主题(抽象目标类):他提供一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者
ConcreteSubject:
具体主题(具体目标类):它实现抽象目标中的通知方法,当具体主题内部状态发生变化的时候,通知所有注册过的观察对象
Observer:
抽象观察者,它是一个抽象类(或接口),包含了一个更新自己(根据抽象主题状态变化做相应操作)的抽象方法,
ConcreteObserver:
具体观察者,实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身状态。
二、实现它
我们定义一个假期对象(被观察者),这个对象有一个状态位从7变换到0 ,
他有2个订阅者(也就是观察者),他们根据不同的假期天数,作出相应的动作。
Observer
package observer;/*** @author 木子的昼夜编程* 观察者 抽象*/
public interface Observer {void response(Integer obj);
}
CapitalistObserver
package observer;/*** @author 木子的昼夜编程* 资本家*/
public class CapitalistObserver implements Observer{@Overridepublic void response(Integer obj) {if (obj == null || obj < 0) {System.out.println("珍惜生命吧!");return;}switch (obj){case 7:System.out.println("资本家:放假第1天,难受,工人拿着免费工资。");break;case 6:System.out.println("资本家:放假第2天,难受,工人拿着免费工资。");break;case 5:System.out.println("资本家:放假第3天,难受,工人拿着免费工资。");break;case 4:System.out.println("资本家:放假第4天,难受,工人拿着免费工资。");break;case 3:System.out.println("资本家:放假第5天,难受,工人拿着免费工资。");break;case 2:System.out.println("资本家:放假第6天,难受,工人拿着免费工资。");break;case 1:System.out.println("资本家:放假第7天,难受,工人拿着免费工资。");break;case 0:System.out.println("资本家:爽呆呆,开始压榨工人了。");break;}}
}
WorkerObserver
package observer;/*** @author 木子的昼夜编程* 打工人*/
public class WorkerObserver implements Observer{@Overridepublic void response(Integer obj) {if (obj == null || obj < 0) {System.out.println("珍惜生命吧!");return;}switch (obj){case 7:System.out.println("打工人:哇!放假了,爽呆呆!。");break;case 6:System.out.println("打工人:还有6天,好无聊。");break;case 5:System.out.println("打工人:还有5天,真爽!");break;case 4:System.out.println("打工人:还有四天,使劲儿造!。");break;case 3:System.out.println("打工人:还有三天呢,可劲儿造!。");break;case 2:System.out.println("打工人:就剩2天啦!!。");break;case 1:System.out.println("打工人:我的天最后一天啦!。");break;case 0:System.out.println("打工人:开始被剥削。");break;}}
}
Subject
package observer;import java.util.ArrayList;
import java.util.List;/*** @author 木子的昼夜编程* 抽象目标类*/
public abstract class Subject {List<Observer> observers;Integer day;public Subject(){//初始化7天day = 7;// 初始化观察者observers = new ArrayList<>();}// 设置删除观察者public void addObserver(Observer observer){observers.add(observer);}public void removeObserver(Observer observer){observers.remove(observer);}// 天数减1public abstract void OneDayless();public abstract void notifyObserver();
}
HolidaysSubject
package observer;/*** @author 木子的昼夜编程* 具体目标类:假期*/
public class HolidaysSubject extends Subject {// 天数减1@Overridepublic void OneDayless(){notifyObserver();day--;}@Overridepublic void notifyObserver() {for (int i = 0; i < observers.size(); i++) {observers.get(i).response(day);}}
}
Client
package observer;/*** @author 木子的昼夜编程*/
public class Client {public static void main(String[] args) {Subject subject = new HolidaysSubject();Observer holidaysSubject = new WorkerObserver();Observer capitalistObserver = new CapitalistObserver();subject.addObserver(holidaysSubject);subject.addObserver(capitalistObserver);// 一天一天过去了subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();}
}
类之间关系:
输出结果:
三、 其他方式实现
我们直接用 java.util.Observer java.util.Observable
我们看一下用这俩类怎么实现:
HolidaysSubject
package observer02;import java.util.Observable;/*** @author 木子的昼夜编程* 具体目标类:假期*/
public class HolidaysSubject extends Observable {Integer day;public HolidaysSubject(){day = 7;}public void OneDayless(){// 通知观察者// 这个标志位一定要设置super.setChanged();super.notifyObservers(day);day--;}
}
CapitalistObserver
package observer02;import java.util.Observable;
import java.util.Observer;/*** @author 木子的昼夜编程*/
public class CapitalistObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {if (arg == null) {System.out.println("珍惜生命吧!");return;}Integer day = Integer.valueOf(arg.toString());switch (day){case 7:System.out.println("资本家:放假第1天,难受,工人拿着免费工资。");break;case 6:System.out.println("资本家:放假第2天,难受,工人拿着免费工资。");break;case 5:System.out.println("资本家:放假第3天,难受,工人拿着免费工资。");break;case 4:System.out.println("资本家:放假第4天,难受,工人拿着免费工资。");break;case 3:System.out.println("资本家:放假第5天,难受,工人拿着免费工资。");break;case 2:System.out.println("资本家:放假第6天,难受,工人拿着免费工资。");break;case 1:System.out.println("资本家:放假第7天,难受,工人拿着免费工资。");break;case 0:System.out.println("资本家:爽呆呆,开始压榨工人了。");break;}}
}
WorkerObserver
package observer02;import java.util.Observable;
import java.util.Observer;/*** @author 木子的昼夜编程* 打工人*/
public class WorkerObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {if (arg == null) {System.out.println("珍惜生命吧!");return;}Integer day = Integer.valueOf(arg.toString());switch (day){case 7:System.out.println("打工人:哇!放假了,爽呆呆!。");break;case 6:System.out.println("打工人:还有6天,好无聊。");break;case 5:System.out.println("打工人:还有5天,真爽!");break;case 4:System.out.println("打工人:还有四天,使劲儿造!。");break;case 3:System.out.println("打工人:还有三天呢,可劲儿造!。");break;case 2:System.out.println("打工人:就剩2天啦!!。");break;case 1:System.out.println("打工人:我的天最后一天啦!。");break;case 0:System.out.println("打工人:开始被剥削。");break;}}
}
Client
package observer02;/*** @author 木子的昼夜编程*/
public class Client {public static void main(String[] args) {// 被观察者HolidaysSubject subject = new HolidaysSubject();// 观察者CapitalistObserver capitalistObserver = new CapitalistObserver();WorkerObserver workerObserver = new WorkerObserver();// 添加观察者subject.addObserver(capitalistObserver);subject.addObserver(workerObserver);// 时间消失subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();subject.OneDayless();}
}
输出结果就不看了,一样的。
四、唠唠
假期不多了,人总是在假期最后一天抱怨,没做很多事。还有初四、初五、初六。你可以做一下你想做的事儿。
这篇关于春节假期过一半了,慌不慌?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!