观察者模式例题代码实现

题目:小明和小张去中介租房子,小明需求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;
        }
    }

}

输出如下:

总结:观察者模式完成了观察者和被观察者之间地解耦,可以看作是一种发布订阅模式,不过与之地区别就是观察者和被观察者是直接操作的,可以看成是一种同步地操作,而发布订阅模式发布者和订阅者之间通过中间管理者进行操作的,可以看成是一种异步的操作。

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用最小二乘法进行拟合的例题代码: ```matlab % 最小二乘法拟合例题代码 % 假设给定的数据点为 (x,y) x = \[1, 2, 3, 4, 5\]; y = \[2, 3, 4, 5, 6\]; % 定义拟合函数为 y = a*x + b % 使用最小二乘法求解 a 和 b 的值 n = length(x); sum_x = sum(x); sum_y = sum(y); sum_xy = sum(x.*y); sum_x2 = sum(x.^2); a = (n*sum_xy - sum_x*sum_y) / (n*sum_x2 - sum_x^2); b = (sum_y - a*sum_x) / n; % 输出拟合结果 disp(\['拟合直线的方程为: y = ', num2str(a), 'x + ', num2str(b)\]); ``` 这段代码使用最小二乘法拟合给定的数据点,得到了拟合直线的方程。在这个例子中,给定的数据点为 (1,2), (2,3), (3,4), (4,5), (5,6)。通过计算,得到拟合直线的方程为 y = 1x + 1。 #### 引用[.reference_title] - *1* *2* [数值计算大作业:最小二乘法拟合(Matlab实现)](https://blog.csdn.net/qq_37262461/article/details/127285334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [最小二乘法实现C++](https://blog.csdn.net/qq_74202016/article/details/128976939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值