设计模式应用二:观察者模式

  1. 、每当有新品上架、商品名称修改、价格修改时都要通知给会员,这也是会员所享有的一种服务。
  2. 、以电商系统下单: 用户购买某件商品下一个订单, 需要: 通知库存系统减少库存、通知商家系统发货、通知支付系统收钱、甚至还会通知关系中心使当前用户关注该商家.
  3. 、支付错误的时候,将调用log和sendEmail和sendPhone方法,需要一种灵活地添加更多故障处理程序的方法。

代码:

public class FaultTester {

public static void main(String[] args) {

FaultMessageGenerator fmg = new FaultMessageGenerator();

new FaultLogger(fmg);

new FaultMailer(fmg);

fmg.faultOccurred(72, "Lost customer data:Peters,V.");

}

} 

public interface FaultListener {

public void handleFault(int faultType, String faultMsg);

}

public class FaultLogger implements FaultListener {

private static Logger logger = Logger.getLogger("");

public FaultLogger(FaultMessageGenerator fmg){

fmg.addFaultListener(this);

}

public void handleFault(int faultType, String faultMsg) {

 logger.log(Level.WARNING,"控制台日志内容:A" + faultType + " occurred " + faultMsg);

}

}

public class FaultMailer implements FaultListener {

private static Logger logger = Logger.getLogger("");

public FaultMailer(FaultMessageGenerator fmg) {

fmg.addFaultListener(this);

}

public void handleFault(int faultType, String faultMsg) {

 logger.info("email内容:A" + faultType + " occurred " + faultMsg);

}

}

  1. 、订阅功能:一个目标可以有任意多个观察者对象,一旦目标的状态发生了改变,所有注册的观察者都会得到通知,然后各个观察者会对通知作出相应的响应,执行相应的业务功能处理,并使自己的状态和目标对象的状态保持一致.(订阅后,如果更新了内容,则邮件通知订阅者)

代码;http://bbs.csdn.net/topics/390175150

 

微信公众号来举例。假设微信用户就是观察者,微信公众号是被观察者,有多个微信用户关注了“程序猿”这个公众号,当这个公众号更新时就会通知这些订阅的微信用户。http://blog.csdn.net/qpc908694753/article/details/78577175

  1.   

根据redis中是否有缓存,来生产出是持久层对象还是redis对象,然后调用对应对象的方法来返回数据。

@Autowired  

private TestFactory factory;

 

City city = factory.getBaseDao(CityDao.class).findByName("温岭市");

---------------------------------------------------------------------------------------------------------

/**

 * 城市 DAO 接口类

 *

 * Created by bysocket on 07/02/2017.

 */

public interface CityDao extends BaseDao {

    /**

     * 根据城市名称,查询城市信息

     * @param cityName 城市名

     */

    City findByName(@Param("cityName") String cityName);

}

---------------------------------------------------------------------------------------------------------

@Repository(value="redisCityDao")

public class RedisCityDao implements CityDao{

 

    private static final String PREFIX = "SYS_CONFIG:";

    

    private JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer();

    

@Autowired

    RedisConnectionFactory redisConnectionFactory;

@Override

public City findByName(String cityName) {

return (City) this.getObject("findByName");

}

    public Object getObject(Object key) {

        if (key != null) {

            String strKey = PREFIX + key.toString();

            RedisClusterConnection conn = redisConnectionFactory

                    .getClusterConnection();

            byte[] bs = conn.get(strKey.getBytes());

            conn.close();

            return jdkSerializer.deserialize(bs);

        }

        return null;

    }

}

---------------------------------------------------------------------------------------------------------

@Component

public class TestFactory implements ApplicationContextAware{

    @Autowired

    RedisConnectionFactory redisConnectionFactory;

    

private ApplicationContext context;

public <T extends BaseDao> T getBaseDao(Class<T> clazz){

 

        RedisClusterConnection conn = redisConnectionFactory.getClusterConnection();

        Map<String, T> map = context.getBeansOfType(clazz);

       if (conn.isClosed()) {

        return map.get(clazz.getSimpleName());

       }else{

        return map.get("redis"+clazz.getSimpleName());

       }

}

@Override

public void setApplicationContext(org.springframework.context.ApplicationContext arg0) throws BeansException {

// TODO Auto-generated method stub

this.context = arg0;

}

}

 

  1.  场景描述:

哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如:

1、购票后记录文本日志

2、购票后记录数据库日志

3、购票后发送短信

4、购票送抵扣卷、兑换卷、积分

5、其他各类活动等

 

传统解决方案:

在购票逻辑等类内部增加相关代码,完成各种逻辑。

存在问题:

1、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。

2、日积月累后,文件冗长,导致后续维护困难。

存在问题原因主要是程序的"紧密耦合",使用观察模式将目前的业务逻辑优化成"松耦合",达到易维护、易修改的目的,

同时也符合面向接口编程的思想

应用实例:

https://blog.csdn.net/swengineer/article/details/6268244

 

3、Spring事件监听:

https://blog.csdn.net/lilovfly/article/details/72758366

https://blog.csdn.net/shirley_john_thomas/article/details/52702889

https://blog.csdn.net/erbao_2014/article/details/68924231?locationNum=9&fps=1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值