Imaging you have a large application, inside this large application you have many small individual applications.

main app

/             |               \

small A     Small B     Small C

For example you are building a redirection service in main app, you want to share some common partten code with small apps A,B,C.

There is one function inside redirection servcice:

Class RedirectionService {
getUrl ({state, isCustomer, namespace}) { }
}

It takes one object which contains 'state', which means in different state, we should redirection to different URL.

Second params is 'isCustomer', which tell whether current user is onboarded customer or not.

Last is 'namespace', which refer to Small A or Small B or Small C applications. Those applications have differnet url configed.

Now the problem is everytime from Small application, I have to tell all three params in order to make it works:

// small A
RedirectService.getUrl ({state: 'some state', isCustomer: CustomerA.isCustomer, namespace: 'small_A'})
RedirectService.getUrl ({state: 'some state_a2', isCustomer: CustomerA.isCustomer, namespace: 'small_A'}) // small B
RedirectService.getUrl ({state: 'some state_b1', isCustomer: CustomerB.isCustomer, namespace: 'small_B'})
RedirectService.getUrl ({state: 'some state_b2', isCustomer: CustomerB.isCustomer, namespace: 'small_B'})

So what we actually prefer is calling like this:

// Small A
RedirectService.getUrl('some state_a1') // Small B
RedirectService.getUrl('some state_b1')

From small applciation component level, we only care 'state',  we don't want to take care 'isCustomer' or 'namespace'.

To achieve this, we can use 'decorator' it is great way to code reuse.

// Take care isCustomer, by inject Customer service for based on different applications.
function NewRedirectionService($delegate, CustomerA) {
// store original function from Redirection Service
const getUrl = $delegate.getUrl; // Create a high order function to wrap original function
¨ // for small apps, they will call this new function instead
function newGetUrl(state) {
// apply common params and call original function
return getUrl.call($delegate, {state, isCustomer: CustomerA.isCustomer, namespace: 'small_A'});
} // override original function by new function.
$delegate.getUrl = newGetUrl; return $delegate;
} // Re-declare 'RedirectService' by using 'decorator'
angular.module('shared').decorator('RedirectionService', NewRedirectionService);

As you can see now, from compmonent level,

before:

RedirectService.getUrl ({state: 'some state', isCustomer: CustomerA.isCustomer, namespace: 'small_A'})

now:

RedirectService.getUrl ('some state')

最新文章

  1. three.js运动
  2. 64 位 Ubuntu 下 android adb 不可用解决方法
  3. Java基础-数据类型转换
  4. Lnmp下安装memcached
  5. ajax中返回包含html的奇葩问题
  6. [ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)
  7. 7.MongoDB java CRUD
  8. Linq第三讲
  9. 用JAVA自己画一张二维码
  10. git使用kdiff3合并乱码问题
  11. [20190402]对比_mutex_wait_scheme不同模式cpu消耗.txt
  12. Dubbo--基于Zookeeper服务与Spring集成
  13. Spring Boot属性配置文件详解
  14. Zookeeper之Zookeeper的Client的分析【转】
  15. python学习 day05打卡
  16. mysql 删除表 外键出错
  17. OC MRC之set方法内存管理(代码分析)
  18. 第七次作业PSP
  19. 【移动端debug-3】部分安卓机型不触发touchend事件的解决方案
  20. 【bzoj1444】[Jsoi2009]有趣的游戏

热门文章

  1. [转帖]什么是WAL?
  2. orcale备份语句
  3. linux系统中启动mysql方式已经客户端如和连接mysql服务器
  4. 记2017年年底,几次Python后端面试
  5. S03_CH01_AXI_DMA_LOOP 环路测试
  6. F12的用法
  7. 怎样使用yum安装nginx
  8. ListUtils的简单集合操作和原理
  9. C语言 读取配置文件
  10. 使用nodejs创建Marketing Cloud的contact数据