题目:小明和小张去中介租房子,小明需求3室两厅的房子,租金不超过6000,小张需求租金不超过1500的房子,中介说你们留下信息,等我有房源通知你们,设计这样的场景并执行输出。
以下是实现代码。如有错误或可优化的地方请提出意见和建议,感谢:
import java.util.ArrayList;
/**
* @author czh
*/
public class ObserverTest {
public static void main(String[] args) {
IntermediarySubject intermediarySubject = new Intermediary();
Person ming = new Ming();
Person zhang = new Zhang();
intermediarySubject.register(ming);
intermediarySubject.register(zhang);
HouseInfo firstHouseInfo = new HouseInfo();
firstHouseInfo.setBedRoomNum(3);
firstHouseInfo.setLivingRoomNum(2);
firstHouseInfo.setPrice(5000);
intermediarySubject.sendHouseInfo(firstHouseInfo);
HouseInfo secondHouseInfo = new HouseInfo();
secondHouseInfo.setBedRoomNum(1);
secondHouseInfo.setLivingRoomNum(1);
secondHouseInfo.setPrice(1200);
intermediarySubject.sendHouseInfo(secondHouseInfo);
}
}
/**
* 抽象的被观察者
*/
interface IntermediarySubject {
/**
* 向被观察者注册客户
*
* @param person 房屋需求者
*/
public void register(Person person);
/**
* 被观察者注销客户
*
* @param person 房屋需求者
*/
public void remove(Person person);
/**
* 向客户发送房屋信息
* @param houseInfo 房屋信息
*/
public void sendHouseInfo(HouseInfo houseInfo);
}
/**
* 中介商
*/
class Intermediary implements IntermediarySubject {
/**
* 保存需要发送信息人的列表
*/
private ArrayList<Person> list = new ArrayList<>();
@Override
public void register(Person person) {
list.add(person);
}
@Override
public void remove(Person person) {
list.remove(person);
}
@Override
public void sendHouseInfo(HouseInfo houseInfo) {
for (Person person : list) {
person.setHouseInfo(houseInfo);
}
}
}
/**
* 房屋信息
*/
class HouseInfo {
private int livingRoomNum;
private int bedRoomNum;
private double price;
public int getLivingRoomNum() {
return livingRoomNum;
}
public void setLivingRoomNum(int livingRoomNum) {
this.livingRoomNum = livingRoomNum;
}
public int getBedRoomNum() {
return bedRoomNum;
}
public void setBedRoomNum(int bedRoomNum) {
this.bedRoomNum = bedRoomNum;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "livingRoomNum :" + livingRoomNum + " bedRoomNum :" + bedRoomNum + " price:" + price;
}
}
/**
* 抽象的观察者
*/
class Person {
protected HouseInfo houseInfo;
public void setHouseInfo(HouseInfo houseInfo) {
this.houseInfo = houseInfo;
printHouseInfo();
}
public HouseInfo getHouseInfo(){
return houseInfo;
}
public void printHouseInfo() {
System.out.println(getHouseInfo().toString());
}
}
class Ming extends Person {
/**
* 小明需求的房屋价格
*/
private final int MING_NEED_PRICE = 6000;
/**
* 小明需求的客厅数量
*/
private final int MING_NEED_LIVINGROOM_NUM = 2;
/**
* 小明需求的卧室数量
*/
private final double MING_NEED_BEDROOM_NUM = 3;
@Override
public void printHouseInfo() {
if(checkNeed()){
System.out.println("Ming want to rent the house," + getHouseInfo().toString());
}
}
/**
* 核验需求
* @return 满足需求返回true,否则返回false
*/
public boolean checkNeed(){
HouseInfo houseInfo = getHouseInfo();
int bedRoomNum = houseInfo.getBedRoomNum();
int livingRoomNum = houseInfo.getLivingRoomNum();
double price = houseInfo.getPrice();
if(bedRoomNum == MING_NEED_BEDROOM_NUM && livingRoomNum == MING_NEED_LIVINGROOM_NUM && price <= MING_NEED_PRICE){
return true;
}else {
return false;
}
}
}
class Zhang extends Person {
/**
* 小张需求的房屋价格
*/
private final int ZHANG_NEED_PRICE = 1500;
@Override
public void printHouseInfo() {
if(checkNeed()){
System.out.println("Zhang want to rent the house," + getHouseInfo().toString());
}
}
/**
* 核验需求
* @return 满足需求返回true,否则返回false
*/
public boolean checkNeed(){
HouseInfo houseInfo = getHouseInfo();
double price = houseInfo.getPrice();
if(price <= ZHANG_NEED_PRICE){
return true;
}else {
return false;
}
}
}
输出如下:
总结:观察者模式完成了观察者和被观察者之间地解耦,可以看作是一种发布订阅模式,不过与之地区别就是观察者和被观察者是直接操作的,可以看成是一种同步地操作,而发布订阅模式发布者和订阅者之间通过中间管理者进行操作的,可以看成是一种异步的操作。