在面向对象编程中,通过 setter
上的 Action
管理 getter/setter
是一种提升代码可维护性和灵活性的设计模式。以下是完整的解析:
setter
的逻辑委托给独立的 Action
类/函数,实现解耦和复用。setter
仅负责赋值,逻辑由 Action
处理。Action
(如验证、日志、通知)。Action
可独立单元测试。Action
可用于多个属性的 setter
。type SetterAction<T> = (value: T) => T | void;
class Product {
private _price: number = 0;
set price(value: number) {
this._price = applyPriceActions(value, [validatePrice, logPriceChange]);
}
get price(): number { return this._price; }
}
// 定义 Action
const validatePrice: SetterAction<number> = (value) => {
if (value < 0) throw new Error("Price cannot be negative");
return value;
};
const logPriceChange: SetterAction<number> = (value) => {
console.log(`Price updated to ${value}`);
};
// 执行 Action 链
function applyPriceActions(value: number, actions: SetterAction<number>[]): number {
return actions.reduce((val, action) => action(val) ?? val, value);
}
interface SetterAction<T> {
execute(value: T): T;
}
class DiscountAction implements SetterAction<number> {
execute(price: number): number {
return price * 0.9; // 10% 折扣
}
}
class Product {
private _price: number = 0;
private actions: SetterAction<number>[] = [new DiscountAction()];
set price(value: number) {
this._price = this.actions.reduce((val, action) => action.execute(val), value);
}
}
Action
逻辑)。Action
依赖特定顺序(如先验证后计算)。Action
实例或复杂逻辑。Action
实例或用纯函数替代类。Action
内部调用 setter
导致栈溢出。getter
。通过 Action
管理 setter
将业务逻辑与数据操作分离,适合中大型项目。优先选择函数式实现以减少样板代码,结合装饰器(如 TypeScript/Java)可进一步简化:
@action([validatePrice, logPriceChange])
set price(value: number) { ... }