设计模式之观察者模式

观察者模式

  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

介绍

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

例如: 小猿在一个招聘网站公司上班,有一天老板对小猿说,我们需要推出一项增值服务。求职者开通会员后,就可以订阅特定公司的职位。小猿觉得这个可以用观察者模式是现实。

1、首先定义主题 subject

/**
 * 招聘网站 通知者的接口
 */
public interface JobSite {
    /**
     * 增加求职者
     *
     * @param jobSeeker 求职者
     */
    void addObserver(JobSeeker jobSeeker);

    /**
     * 移除求职者
     *
     * @param jobSeeker 求职者
     */
    void removeObserver(JobSeeker jobSeeker);

    /**
     * 通知求职者
     */
    void notifyJobSeeker();

    List getCompanyList();

}

2. 抽象观察者Observer 

/**
 * 观察者抽象类(求职者)
 */
public abstract class JobSeeker {
    public JobSite jobSite;
    private String name;

    public String getName() {
        return name;
    }

    public JobSeeker(JobSite jobSite,String name ){
        this.jobSite=jobSite;
        this.name=name;
    }
    /**
     * 发送简历
     */
    public abstract void send();

}

3.具体的主题实现类 

/**
 * 招聘网站,通知者主体实现类
 */
public class FiveJobSite implements JobSite {
    /**
     * 观察者数组
     */
    List jobSeekers=new ArrayList<>();
    /**
     * 公司列表
     */
    List companyList;

    public FiveJobSite(List companyList){
        this.companyList=companyList;
    }
    @Override
    public void addObserver(JobSeeker jobSeeker) {
        jobSeekers.add(jobSeeker);
    }

    @Override
    public void removeObserver(JobSeeker jobSeeker) {
        jobSeekers.remove(jobSeeker);
    }

    @Override
    public void notifyJobSeeker() {
         for(JobSeeker jobSeeker:jobSeekers){
             jobSeeker.send();
         }
    }

    @Override
    public List getCompanyList() {
        return this.companyList;
    }
}

 

4. 观察者的实现

  
/**
 * 求职者(观察者实现类) 求职者小王
 */
public class WangJobSeeker extends JobSeeker {
    protected static List companies = new ArrayList<>();
    private JobSite jobSite;
    static {
        Company al = new Company("阿里","java程序猿",30000);
        companies.add(al);
    }
    public WangJobSeeker(JobSite jobSite,String name) {
        super(jobSite,name);
        this.jobSite=jobSite;
    }

    /**
     * 通知方法
     */
    @Override
    public   void send() {
        for (Company company : companies) {
            for(Company jobc:jobSite.getCompanyList()){
                if (company.getName().equals(jobc.getName())
                        && company.getSalary() <= jobc.getSalary()
                        && company.getJobName().equals(jobc.getJobName())) {
                    System.out.println(company.getName() + "招聘" + company.getJobName() + "职位"
                            + "薪资"+jobc.getSalary()+"高于:" + company.getSalary() + "元/月" + ""+this.getName()+"投送给简历");
                    break;
                }
            }
        }
    }

}
/**
 * 求职者(观察者实现类) 求职者小张
 */
public class ZhangJobSeeker extends JobSeeker {
    private JobSite jobSite;
    protected static List companies = new ArrayList<>();
    static {
        Company juHua = new Company("菊花","java程序猿",22000);
        Company jd = new Company("京东","java程序猿",18000);
        companies.add(juHua);
        companies.add(jd);
    }

    public ZhangJobSeeker(JobSite jobSite,String name) {
        super(jobSite,name);
        this.jobSite=jobSite;
    }

    @Override
    public  void send() {
        for (Company company : companies) {
            for(Company jobc:jobSite.getCompanyList()){
                if (company.getName().equals(jobc.getName())
                        && company.getSalary() <= jobc.getSalary()
                        && company.getJobName().equals(jobc.getJobName())) {
                    System.out.println(company.getName() + "招聘" + company.getJobName() + "职位"
                            + "薪资"+jobc.getSalary()+"高于:" + company.getSalary() + "元/月" + ""+this.getName()+"投送给简历");
                    break;
                }
            }
        }
    }
}
/**
 * 公司实体
 */
public class Company {

    private String name;
    private String  jobName;
    public int salary;
    public Company(String name,String jobName,int salary){
        this.name=name;
        this.jobName=jobName;
        this.salary=salary;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

}

5、客户端实现

public class Client {
    public static void main(String [] args){
        List list=new ArrayList<>();
        Company juhua=new Company("菊花","java程序猿",22000);
        list.add(juhua);
        Company jd=new Company("京东","java程序猿",18000);
        list.add(jd);
        Company al=new Company("阿里","java程序猿",30000);
        list.add(al);
        FiveJobSite jobSite=new FiveJobSite(list);
        ZhangJobSeeker xiaozhang=new ZhangJobSeeker(jobSite,"小张");
        WangJobSeeker xiaowang=new WangJobSeeker(jobSite,"小王");
        jobSite.addObserver(xiaozhang);
        jobSite.addObserver(xiaowang);
        jobSite.notifyJobSeeker();
    }
}

6、测试结果

设计模式之观察者模式_第1张图片

你可能感兴趣的:(设计模式,设计模式,观察者模式,java)