Design Pattern - Decorator

以前对Decorator模式一直印象不深,甚至觉得有点鸡肋.问题是我为什么要用这个模式,难道直接继承不是更直接吗? 简约就是最好的,这个原则适用于所有领域.

的确,这个模式确实好坏参半,最大的优点是对类的职责进行了剥离,使得功能的添加更加层次化,相比一个巨大的类,这个当然看起来不错. 装修的都是附加的功能和基本功能的扩展. 只不过,这样做的代价并不低, 比如产生很多装修类的碎片,增加了功能逻辑的碎片化,装修的时候,也难以很好的隔离原始类,尤其原始类是个庞大的类时,如果不能隔离,这个模式,也就破产. 我到目前为止,没有看到很好的实际应用的例子.

所以只能评价为军训级别(战斗中很少用), 其实我想说鸡肋级别, 不过如果谁有很好的体会,可以讨论,非常想听典型场景.


适用场景:(军训级别)

1. 对单个对象,添加非其核心的修饰性功能,而原对象保持不变

2. 对某个方法进行修改,但是又不方便修改原类.


特点:

要求装修类和原始类同接口,这一点只是出于透明操作的原则.

原始类应该保持简单.


区别:

      Proxy不改变原有功能

      Strategy是行为委托模式, Decorator是结构委托模式.

// Decorator.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class Target
{
public:
	virtual void Method(){
		cout << "Target method call." << endl;
	}
};

class Decorator : public Target
{
	Target* _component; //Target for decorating
public:
	Decorator(Target* component): _component(component){}

	virtual void Method(){
		_component->Method();

		cout << "Im worker for decorating your house." << endl;
	}
};

class TargetConcret : public Target
{
public:
	virtual void Method(){
		cout << "This is new house I just buy." << endl;
	}
};

int main(int argc, char* argv[])
{
	TargetConcret* house = new TargetConcret();

	Decorator decorator(house);

	decorator.Method();
	return 0;
}


转载于:https://my.oschina.net/zhujinbao/blog/223882

<think>我们正在讨论Ant Design Vue (a-form)中的表单验证问题,特别是使用v-decorator.trim时验证规则的配置,以及输入框位置偏移的问题。 首先,回顾一下v-decorator.trim的作用:它用于自动去除输入值的前后空白字符。这在用户输入时特别有用,可以避免用户无意中输入的空格导致验证失败。 关于验证规则: 在Ant Design Vue中,我们可以通过rules属性为每个表单项定义验证规则。这些规则是一个数组,每个规则对象可以包含多个属性,如required(是否必填)、message(验证失败时的提示信息)、validator(自定义验证函数)等。 当使用v-decorator.trim时,由于它会自动去除输入值的前后空格,因此我们在验证规则中不需要再写trim操作。但是,需要注意的是,trim操作是在表单提交前自动完成的,所以在自定义验证函数中,我们得到的值已经是去除前后空格后的值。 配置验证规则示例: 假设我们有一个用户名输入框,要求必填且最小长度为2,最大长度为10。我们可以这样配置: ```vue <template> <a-form :form="form"> <a-form-item label="用户名"> <a-input v-decorator.trim="[ 'username', { rules: [ { required: true, message: '请输入用户名' }, { min: 2, message: '用户名至少2个字符' }, { max: 10, message: '用户名不能超过10个字符' } ] } ]" /> </a-form-item> </a-form> </template> <script> export default { beforeCreate() { this.form = this.$form.createForm(this); } }; </script> ``` 注意:v-decorator.trim的写法,trim修饰符直接加在v-decorator后面。 关于输入框位置偏移问题: 这个问题通常是由于表单布局或样式引起的。可能的原因包括: 1. 表单项(a-form-item)的布局设置(layout)与内部元素不匹配。 2. 自定义样式覆盖了默认样式,导致输入框位置偏移。 解决方案: 1. 检查表单的layout属性。Ant Design Vue的表单支持三种布局:horizontal(水平)、vertical(垂直)、inline(行内)。根据布局调整样式。 2. 如果使用了自定义样式,检查是否有影响输入框位置的样式,例如padding、margin等。 3. 使用浏览器开发者工具检查元素,查看具体是哪个样式导致了偏移,然后覆盖该样式。 例如,在水平布局中,标签和输入框是并排的,标签有固定的宽度。如果标签内容过长,可能会导致输入框位置偏移。我们可以通过设置标签的宽度来调整: ```vue <a-form-item label="用户名" :label-col="{ span: 4 }" :wrapper-col="{ span: 14 }"> <!-- 输入框 --> </a-form-item> ``` 或者,我们可以通过全局样式调整: ```css .ant-form-item-label { width: 100px; /* 自定义宽度 */ } ``` 4. 如果偏移是由于输入框本身的高度不一致(比如有错误信息时)导致的,可以尝试给表单项设置固定的高度,或者使用min-height。 5. 另外,当使用v-decorator.trim时,并不会直接导致位置偏移,所以偏移问题可能是其他原因造成的。 如果以上方法不能解决问题,请提供具体的代码和偏移现象的截图,以便更准确地定位问题。 最后,关于验证规则的一个常见问题:如果我们希望禁止输入空格(而不仅仅是去除前后空格),我们可以使用自定义验证规则,在验证函数中检查输入值是否包含空格。例如,禁止用户名中间有空格: ```javascript rules: [ { required: true, message: '请输入用户名' }, { min: 2, message: '用户名至少2个字符' }, { max: 10, message: '用户名不能超过10个字符' }, { pattern: /^\S*$/, message: '用户名不能包含空格' } ] ``` 这里使用了正则表达式,确保输入的用户名中不包含任何空格。 总结: 1. v-decorator.trim可以方便地去除输入值的前后空格,在验证规则中不需要再处理空格。 2. 输入框位置偏移问题通常与布局和样式有关,需要根据具体情况调整样式。 3. 使用rules数组配置验证规则,可以包含内置规则和自定义规则。 希望这些信息能帮助你解决问题。如果还有其他疑问,请提供更多细节。</think>### 使用 `a-form-item` 和 `v-decorator.trim` 的验证规则与位置偏移解决方案 #### 1. `v-decorator.trim` 验证规则配置 `v-decorator.trim` 会自动去除输入值的前后空格,验证规则需注意以下要点: **语法示例**: ```vue <a-form-item label="用户名"> <a-input v-decorator.trim="[ 'username', { rules: [ { required: true, message: '请输入用户名' }, { pattern: /^[\u4e00-\u9fa5a-zA-Z0-9]+$/, message: '不能包含空格' }, { validator: customValidator } ] } ]" /> </a-form-item> ``` **关键配置**: 1. **空格处理** `trim` 会在验证前自动去除首尾空格,但需在规则中明确禁止中间空格: ```js { pattern: /^\S*$/, message: '不能包含空格' } ``` 2. **自定义验证器** 在验证器中直接使用处理后的值: ```js const customValidator = (rule, value, callback) => { // value 已自动 trim if (value.length < 4) callback('至少4个字符') else callback() } ``` 3. **混合规则** 内置规则 + 自定义规则的组合: ```js rules: [ { required: true, message: '必填项' }, { min: 3, message: '最少3字符' }, { validator: checkSpecialChars } ] ``` #### 2. 输入框位置偏移解决方案 常见原因及修复方法: **1. 布局冲突** **问题**:表单标签宽度不一致导致错位 **修复**:固定标签宽度 ```vue <a-form :labelCol="{ span: 6 }" :wrapperCol="{ span: 14 }"> <!-- 表单项 --> </a-form> ``` **2. 校验信息撑开高度** **问题**:错误提示导致表单项高度变化 **修复**:预置错误消息高度 ```css .ant-form-item { min-height: 62px; /* 根据实际高度调整 */ } ``` **3. 表单嵌套冲突** **问题**:多层表单容器导致定位异常 **修复**:避免非常规嵌套 ```vue <!-- 错误示例 --> <div v-for="item in list"> <a-form>...</a-form> <!-- 避免循环内创建表单 --> </div> <!-- 正确做法 --> <a-form> <div v-for="item in list"> <a-form-item>...</a-form-item> </div> </a-form> ``` **4. CSS 权重问题** **问题**:自定义样式覆盖默认样式 **修复**:增强样式权重 ```css /* 添加父级选择器提高权重 */ .ant-form .ant-form-item { margin-bottom: 24px !important; } ``` **5. 响应式断点问题** **问题**:特定屏幕尺寸下错位 **修复**:添加响应式样式 ```css @media (max-width: 768px) { .ant-form-item-label { text-align: left !important; } } ``` #### 最佳实践建议 1. **表单统一配置** 在顶层统一设置布局参数: ```vue <a-form :form="form" :labelCol="{ span: 4 }" :wrapperCol="{ span: 18 }" @submit="handleSubmit" > ``` 2. **动态验证规则** 使用 `rules` 的动态绑定: ```js computed: { dynamicRules() { return [ { required: this.isRequired, message: '动态必填' }, { pattern: /^[A-Z]+$/, message: '需全大写' } ] } } ``` 3. **调试工具** 使用浏览器开发者工具检查元素盒模型: - 检查 `margin/padding` 异常值 - 查看 `position: absolute` 的定位元素 - 检测 `display: flex` 容器的对齐方式 > 注:若问题仍存在,请提供具体代码片段和界面截图以便精准定位[^1]。 --- ### 相关问题 1. 如何在 Ant Design Vue 中实现动态表单验证规则? 2. 表单提交时如何获取所有已 `trim` 处理的值? 3. 响应式布局下表单错位的系统化调试方法有哪些? 4. 如何自定义 Ant Design 表单错误提示的样式和位置? [^1]: 表单布局问题通常源于容器尺寸计算或样式覆盖,建议优先检查父元素的布局模式(Flex/Grid)和表单项的盒模型参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值