前端开发筹划模式——装饰器模式

打印 上一主题 下一主题

主题 1847|帖子 1847|积分 5541

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
一、装饰器模式的定义和特点
1.定义
2.特点
二、装饰器模式的实现方式
1.在原生JS中实现(以类的情势为例)
2、在Vue中实现(以指令和混入为例)
        2.1、指令方式实现装饰功能
        2.2、混入方式实现装饰功能
三、装饰器模式的利用场景
1.用户界面增强
2.权限管理
3.数据处理与展示
四、装饰器模式的优点
1.灵活性
2.遵照开闭原则
3.单一职责原则的体现
五、装饰器模式的缺点
1.增长复杂性
2.可能影响性能
六、装饰器模式的留意事项
1.接口的稳定性
2.克制过度装饰
3.装饰器次序


一、装饰器模式的定义和特点

1.定义

        装饰器模式是一种布局型筹划模式,它允许在不改变对象布局的环境下,动态地给一个对象添加一些额外的功能。这个模式通过创建装饰类来包装原始对象,装饰类与原始对象实现类似的接口,从而可以在运行时根据需要组合差异的装饰类来扩展对象的功能。
2.特点

        保持接口一致性:装饰类和被装饰类实现类似的接口,如许在利用装饰后的对象时,对于客户端来说,它看起来仍旧是原始类型的对象,客户端代码不需要进行修改就可以利用被装饰后的对象。
        动态扩展性:可以在运行时动态地添加或移除装饰,根据差异的需求灵活组合装饰类,以实现差异的功能组合。
        单一职责原则:每个装饰类都专注于一个特定的功能扩展,如许代码的可维护性和可读性更高。
二、装饰器模式的实现方式

1.在原生JS中实现(以类的情势为例)

        (1)起首定义一个基础接口或者抽象类(在 JavaScript 中可以利用抽象类的概念来模拟)。例如,定义一个 Component 抽象类表现可被装饰的组件:
  1.    class Component {
  2.        operation() {
  3.            throw new Error('Abstract method must be implemented');
  4.        }
  5.    }
复制代码
        (2)然后创建一个详细的组件类实现这个接口,例如 ConcreteComponent:
  1.    class ConcreteComponent extends Component {
  2.        operation() {
  3.            console.log('ConcreteComponent operation');
  4.        }
  5.    }
复制代码
        (3)接着定义装饰器类,装饰器类也继承自 Component 抽象类,并且在构造函数中接收一个 Component 类型的实例,例如 Decorator:
  1.    class Decorator extends Component {
  2.        constructor(component) {
  3.            super();
  4.            this.component = component;
  5.        }
  6.        operation() {
  7.            this.component.operation();
  8.        }
  9.    }
复制代码
        (4)最后创建详细的装饰器类,例如 ConcreteDecoratorA 和 ConcreteDecoratorB,它们在 operation 方法中添加额外的功能:
  1.    class ConcreteDecoratorA extends Decorator {
  2.        operation() {
  3.            console.log('ConcreteDecoratorA before operation');
  4.            super.operation();
  5.            console.log('ConcreteDecoratorA after operation');
  6.        }
  7.    }
  8.    class ConcreteDecoratorB extends Decorator {
  9.        operation() {
  10.            console.log('ConcreteDecoratorB before operation');
  11.            super.operation();
  12.            console.log('ConcreteDecoratorB after operation');
  13.        }
  14.    }
复制代码
        (5)利用方式如下:
  1.    const component = new ConcreteComponent();
  2.    const decoratedComponentA = new ConcreteDecoratorA(component);
  3.    const decoratedComponentAB = new ConcreteDecoratorB(decoratedComponentA);
  4.    decoratedComponentAB.operation();
复制代码
2、在Vue中实现(以指令和混入为例)

        2.1、指令方式实现装饰功能

                假设我们有一个基础的 Vue 组件,例如一个简朴的按钮组件:
  1.    <template>
  2.        <button @click="handleClick">Base Button</button>
  3.    </template>
  4.    <script>
  5.    export default {
  6.        methods: {
  7.            handleClick() {
  8.                console.log('Button clicked');
  9.            }
  10.        }
  11.    };
  12.    </script>
复制代码
                我们可以创建一个指令来装饰这个按钮组件,例如给按钮添加权限验证功能的指令。起首定义指令:
  1.    Vue.directive('permission - check', {
  2.        inserted: function (el, binding) {
  3.            // 假设这里有一个权限验证逻辑,比如根据用户权限角色判断是否有点击按钮的权限
  4.            const hasPermission = checkPermission(binding.value);
  5.            if (!hasPermission) {
  6.                el.disabled = true;
  7.            }
  8.        }
  9.    });
复制代码
                这里的 checkPermission 是一个假设的函数,用于查抄权限。然后在组件中利用这个指令:
  1.    <template>
  2.        <button @click="handleClick" v - permission - check="'button - click - permission'">
  3.            Base Button
  4.        </button>
  5.    </template>
复制代码
        2.2、混入方式实现装饰功能

                假设我们有一个基础的显示数据的 Vue 组件:
  1.    <template>
  2.        <div>{{ data }}</div>
  3.    </template>
  4.    <script>
  5.    export default {
  6.        data() {
  7.            return {
  8.                data: 'Base Data'
  9.            };
  10.        }
  11.    };
  12.    </script>
复制代码
                我们可以创建一个混入(mixin)来装饰这个组件,例如给数据添加格式化功能的混入。定义混入:
  1.    const formatDataMixin = {
  2.        computed: {
  3.            formattedData() {
  4.                return format(this.data);
  5.            }
  6.        }
  7.    };
复制代码
                这里的 format 是一个假设的函数,用于格式化数据。然后在组件中利用这个混入:
  1.    export default {
  2.        mixins: [formatDataMixin],
  3.        data() {
  4.            return {
  5.                data: 'Base Data'
  6.            };
  7.        },
  8.        computed: {
  9.            // 可以在组件中继续使用原始数据或者新的格式化后的数据
  10.            combinedData() {
  11.                return this.data +'(' + this.formattedData + ')'
  12.            }
  13.        }
  14.    };
复制代码
三、装饰器模式的利用场景

1.用户界面增强

        在前端界面开发中,常用于给用户界面组件添加额外功能。例如,给输入框组件添加验证功能,如必填项验证、格式验证等。可以创建一个 ValidationDecorator 来装饰输入框组件,在用户输入数据时进行验证,而不需要修改输入框组件的原始代码。
2.权限管理

        对于一些页面元素,如菜单、按钮等,可以利用装饰器模式添加权限查抄功能。例如,创建一个 PermissionDecorator,它在渲染组件之前查抄用户是否具有访问该组件所代表功能的权限,假如没有权限则隐藏或禁用该组件。
3.数据处理与展示

        在处理从服务器获取的数据时,可以利用装饰器模式对数据进行加工和美化后再展示。例如,创建一个 FormattingDecorator,假如获取到的是日期数据,可以将其格式化为更友好的显示情势,如将时间戳转换为指定格式的日期字符串。
四、装饰器模式的优点

1.灵活性

        可以根据详细需求动态地组合装饰器,添加或移除功能。例如,在差异的用户角色或业务场景下,可以灵活地给组件添加差异的功能装饰,而不需要重新编写组件的核心代码。
2.遵照开闭原则

        不需要修改原始类的代码就可以扩展其功能。这使得在项目维护和功能迭代过程中,代码的稳定性更高。当需要添加新功能时,只需创建新的装饰类并进行组合即可。
3.单一职责原则的体现

        每个装饰类只负责一个特定的功能扩展,使得代码布局更加清晰,易于理解和维护。开发职员可以专注于每个功能的实现,降低了代码的复杂性。
五、装饰器模式的缺点

1.增长复杂性

        假如过度利用装饰器模式,会导致代码布局变得复杂,尤其是在有多个装饰器层层嵌套的环境下。这可能会使代码的调试和理解变得困难,对于新加入项目标开发职员来说,需要花费更多的时间来理解装饰器之间的关系。
2.可能影响性能

        在某些环境下,由于装饰器的层层嵌套,可能会导致额外的函数调用开销,从而影响性能。特别是在对性能要求较高的应用场景中,需要审慎利用装饰器模式并进行性能优化。
六、装饰器模式的留意事项

1.接口的稳定性

        装饰类和被装饰类所实现的接口(或遵照的协议)应该保持稳定。假如接口发生变化,可能会导致装饰器与被装饰对象之间的不兼容,从而需要修改大量的代码。
2.克制过度装饰

       要审慎利用装饰器模式,克制创建过多不必要的装饰器以及过度嵌套装饰器。在筹划阶段就应该评估功能需求,尽量保持装饰器布局的简便性,以淘汰复杂性和性能题目。
3.装饰器次序

         在组合多个装饰器时,装饰器的次序可能会影响最终的结果。例如,一个先进行数据加密再进行数据压缩的装饰器次序,与先进行数据压缩再进行数据加密的次序,得到的结果可能是差异的。因此,在利用装饰器模式时,需要明确装饰器的次序以及其对功能的影响。

        关于装饰器模式的分享就到此竣事了,假如对于其他筹划模式有兴趣的话,可以点击右下角“专栏目录”查看更多筹划模式


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表