- 、每当有新品上架、商品名称修改、价格修改时都要通知给会员,这也是会员所享有的一种服务。
- 、以电商系统下单: 用户购买某件商品下一个订单, 需要: 通知库存系统减少库存、通知商家系统发货、通知支付系统收钱、甚至还会通知关系中心使当前用户关注该商家.
- 、支付错误的时候,将调用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);
}
}
- 、订阅功能:一个目标可以有任意多个观察者对象,一旦目标的状态发生了改变,所有注册的观察者都会得到通知,然后各个观察者会对通知作出相应的响应,执行相应的业务功能处理,并使自己的状态和目标对象的状态保持一致.(订阅后,如果更新了内容,则邮件通知订阅者)
代码;http://bbs.csdn.net/topics/390175150
微信公众号来举例。假设微信用户就是观察者,微信公众号是被观察者,有多个微信用户关注了“程序猿”这个公众号,当这个公众号更新时就会通知这些订阅的微信用户。http://blog.csdn.net/qpc908694753/article/details/78577175
- 、
根据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、购票后记录文本日志
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