浅析Java设计模式(三)

本篇文章继续来学习Java的设计模式,这篇文章来解析行为型模式种的几种比较常用的设计模式。

一、观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。以微信推送腾讯新闻为例,用户在微信订阅了腾讯新闻后,用户会收到腾讯的新闻推送。如果用户取消了新闻订阅,那么就不会再收到推送。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。

以订阅微信公众号为例:

用户在微信订阅了微信公众号后,会收到公众号的消息推送。如果用户取消了订阅,那么就不会再收到推送。

1.观察者Observer抽象层

观察者订阅公众号后会监听公众号推送的消息,推送后观察者会收到更新。可以抽象出一个观察者接口:

/**
 * 观察者抽象层
 */
public interface Observer {
    void update(String obj);
}

2.观察者实现

用户实现观察者接口,收到消息后将消息打印:

/**
 * 观察者实现
 */
public class UserObserver implements Observer {

    private String name;
    private String message;

    public UserObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        this.message = message;
        readMessage();
    }

    private void readMessage() {
        System.out.println(name + "收到一条消息:" + message);
    }
}

3.被观察者抽象层

被观察者提供订阅、取消订阅、发布消息、以及发布消息后通知观察者的功能:

/**
 * 被观察者抽象层
 */
public interface Observable {
    void addObserver(Observer observer);

    void removeObserver(Observer observer);

    void notifyObservers();

    // 发布消息
    void pushMessage(String message);
}

4.被观察者实现

定义一个公众号的被观察者,并实现Observable:

/**
 * 被观察者
 */
public class WechatObservable implements Observable {

    private final List<Observer> list = new ArrayList<>();
    private String message;

    @Override
    public void addObserver(Observer observer) {
        list.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        list.remove(observer);
    }


    @Override
    public void notifyObservers() {
        for (Observer observer : list) {
            observer.update(message);
        }
    }

    @Override
    public void pushMessage(String message) {
        this.message = message;
        // 通知订阅的用户
        notifyObservers();
    }
}

5.测试代码

public class ObserverTest {

    public static void main(String[] args) {
        WechatObservable wechatObservable = new WechatObservable();
        UserObserver ryan = new UserObserver("Ryan");
        UserObserver frank = new UserObserver("Mike");

        wechatObservable.addObserver(ryan);
        wechatObservable.addObserver(frank);

        wechatObservable.pushMessage("this is a news");
    }
}

打印结果:

Ryan收到一条消息:this is a news
Mike收到一条消息:this is a news

二、策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。策略模式设计三个角色,环境(Context)角色、抽象策略(Strategy)角色以及具体策略(ConcreteStrategy)角色。
来看一个现实生活的例子,假设一个商场有三种会员(Strategy),分别为普通会员(StandardMemberStraegy)、白银会员(SilverMemberStrategy)以及黄金会员(GoldenMemberStrategy)。针对三种会员分别制定了不同的优方案。普通会员打九折、白银会员打八折、黄金会员打七折。来看如何用策略模式实现上述场景。

1.创建抽象策略类

public abstract class Strategy {
	
	private String strategy;
	
	
	public String getStrategy() {
		return strategy;
	}



	public Strategy(String strategy) {
		super();
		this.strategy = strategy;
	}
	
	abstract double getPrice(double normalPrice);
}

2.创建环境类(Context)并持有抽象策略类

public class Context {
	private Strategy mStrategy;
	
	public void setStrategy(Strategy strategy) {
		mStrategy=strategy;
	}
	
	public double executePrice(double normalPrice) {
		System.out.println(mStrategy.getStrategy()+"Member,折后价:"+mStrategy.getPrice(normalPrice));
		return mStrategy.getPrice(normalPrice);
	}
}

3.创建三种会员策略类

public class StandardMemberStraegy extends Strategy {
	
	public StandardMemberStraegy(String strategy) {
		super(strategy);
	}

	@Override
	public double getPrice(double normalPrice) {
		return 0.9*normalPrice;
	}
}

public class SilverMemberStrategy extends Strategy{

	public SilverMemberStrategy(String strategy) {
		super(strategy);
	}

	@Override
	public double getPrice(double normalPrice) {
		return 0.8*normalPrice;
	}

}

public class GoldenMemberStrategy extends Strategy {


	public GoldenMemberStrategy(String strategy) {
		super(strategy);
	}

	@Override
	public double getPrice(double normalPrice) {
		return 0.7*normalPrice;
	}
	
}

4.创建策略模式测试类

public class StrategyTest {

	public static void main(String[] args) {
		StandardMemberStraegy standar=new StandardMemberStraegy("Standar");
		SilverMemberStrategy silver=new SilverMemberStrategy("Silver");
		GoldenMemberStrategy golden=new GoldenMemberStrategy("Golden");
		Context context=new Context();
		
		context.setStrategy(standar);
		context.executePrice(100);
		
		context.setStrategy(silver);
		context.executePrice(100);
		
		context.setStrategy(golden);
		context.executePrice(100);
	}

}

运行结果:

StandarMember,折后价:90.0
SilverMember,折后价:80.0
GoldenMember,折后价:70.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值