- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了下面的示例,它使工厂能够将具有功能的对象打包,但是问题是功能与对象分离。
我的最终目标是附加功能,如log、save 和display,它们对每个不同对象的特定属性进行操作。
我如何保留此示例的外部装饰方面,但启用诸如将对象数据保存到数据库的“保存”或记录其事件的“日志”等功能?
using System;
using System.Collections.Generic;
namespace FuncAdorn3923
{
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();
ObjectFactory.Instance.AdornFunctionality(customer, "add");
Console.WriteLine(customer.CallAlgorithm("add", 64, 36));
Employee employee = new Employee();
ObjectFactory.Instance.AdornFunctionality(employee, "add");
ObjectFactory.Instance.AdornFunctionality(employee, "subtract");
Console.WriteLine(employee.CallAlgorithm("add", 5, 15));
Console.WriteLine(employee.CallAlgorithm("subtract", 66, 16));
Console.ReadLine();
}
}
public class ObjectFactory
{
private static ObjectFactory singleton;
public void AdornFunctionality(AdornedObject ao, string idCode)
{
Func<int, int, int> add = (i, j) => i + j;
Func<int, int, int> subtract = (i, j) => i - j;
switch (idCode)
{
case "add":
ao.LoadAlgorithm(idCode, add);
break;
case "subtract":
ao.LoadAlgorithm(idCode, subtract);
break;
}
}
public static ObjectFactory Instance
{
get
{
if (singleton == null)
singleton = new ObjectFactory();
return singleton;
}
}
}
public abstract class AdornedObject
{
private Dictionary<string, Func<int, int, int>> algorithms =
new Dictionary<string, Func<int, int, int>>();
public void LoadAlgorithm(string idCode, Func<int,int,int> func)
{
algorithms.Add(idCode, func);
}
public int CallAlgorithm(string idCode, int i1, int i2)
{
Func<int,int,int> func = algorithms[idCode];
return func.Invoke(i1, i2);
}
}
public class Customer : AdornedObject
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int NumberOfProductsBought { get; set; }
}
public class Employee : AdornedObject
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
}
最佳答案
我个人会推荐一种更好的设计模式,如访问者模式,但为了它的值(value),您可以通过放弃类型安全来使您的代码正常工作。使用 Delegate
而不是其派生类 Func
和 Action
:
static void Main(string[] args)
{
Customer customer = new Customer();
ObjectFactory.Instance.AdornFunctionality(customer, "add");
Console.WriteLine(customer.CallAlgorithm("add", 64, 36));
Employee employee = new Employee();
ObjectFactory.Instance.AdornFunctionality(employee, "add");
ObjectFactory.Instance.AdornFunctionality(employee, "subtract");
ObjectFactory.Instance.AdornFunctionality(employee, "save");
Console.WriteLine(employee.CallAlgorithm("add", 5, 15));
Console.WriteLine(employee.CallAlgorithm("subtract", 66, 16));
Console.WriteLine(employee.CallAlgorithm("save"));
Console.ReadLine();
}
}
public class ObjectFactory
{
private static ObjectFactory singleton;
public void AdornFunctionality(AdornedObject ao, string idCode)
{
Func<int, int, int> add = (i, j) => i + j;
Func<int, int, int> subtract = (i, j) => i - j;
Action save = () => Console.WriteLine("{0} has been saved", ao.ToString());
switch (idCode)
{
case "add":
ao.LoadAlgorithm(idCode, add);
break;
case "subtract":
ao.LoadAlgorithm(idCode, subtract);
break;
case "save":
ao.LoadAlgorithm(idCode, save);
break;
}
}
public static ObjectFactory Instance
{
get
{
if (singleton == null)
singleton = new ObjectFactory();
return singleton;
}
}
}
public abstract class AdornedObject
{
private Dictionary<string, Delegate> algorithms = new Dictionary<string, Delegate>();
public void LoadAlgorithm(string idCode, Delegate func)
{
algorithms.Add(idCode, func);
}
public object CallAlgorithm(string idCode, params object[] args)
{
Delegate func = algorithms[idCode];
return func.DynamicInvoke(args);
}
}
关于c# - "adorn objects with functionality"的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1538257/
我正在实现此处提到的拖放解决方案: http://bea.stollnitz.com/blog/?p=53 我有几个 ListBoxes + 带有 WrapPanel 和 Items。我应该能够将项目
我正在尝试在 wpf 中创建一个叠加层(背景变暗),类似于您可以在网上找到的用于弹出图像的叠加层。 我希望它可以在应用程序的多个部分中重复使用,并具有不同类型的内容。 这是装饰器类的构造函数的临时代码
在 WPF 中如何放置常规 UIElement s 内嵌文本?例如,某种文本分类将用包含特定选项的下拉列表替换一段文本。 我使用了像 Span、Bold、Hyperlink 这样的对象,它们对内联文本
我为 TextBlock 元素创建了一个简单的装饰器,允许用户更改其大小。您可以更改 block 的四个角的大小,即一次更改两个大小(左上拇指、右上拇指、左下拇指、右下拇指)。一切正常,您可以在第一个
有什么方法可以让 WPF 装饰器完全忽略鼠标,以便装饰器背后的 UIElement 仍然获得鼠标事件,就好像装饰器不存在一样? 最佳答案 将 IsHitTestVisible 的 Adorner 属性
我目前有一个 Adorner在 ScrollViewer 内.滚动查看器底部的对象有时会在其下方显示一个大装饰器。不幸的是,该装饰器不包含在 ExtentHeight 中。滚动查看器的底部,因此装饰器
装饰器如何在 UWP 应用中实现?如果它们的实现方式与标准 WPF 中的相同,则应使用什么命名空间/程序集? 最佳答案 Adorners未在 UWP 中实现。 An Adorner is a cust
我做了下面的示例,它使工厂能够将具有功能的对象打包,但是问题是功能与对象分离。 我的最终目标是附加功能,如log、save 和display,它们对每个不同对象的特定属性进行操作。 我如何保留此示例的
我希望这是一个很好的问题,所以我会详细写下我想要实现的目标、我在 Internet 上找到的内容,并展示我到目前为止所做的事情和我尝试过的事情。 我需要为我的应用程序添加拖放功能。我有要拖动到列表框项
我正在使用 MVVM 开发 WPF 应用程序。我的大部分 View 只有 xaml 标记,而代码隐藏没有任何内容(默认样板除外)。 除一个 View 外,当我想禁用整个屏幕时,我使用装饰器将屏幕“变黑
我的 Go diagram 上的 contextMenu 定义如下 SeatingMapGraphicsRef.contextMenu = $(go.Adornment, "Vertical",
我正在尝试添加一个简单的文本 block 作为控件的装饰。但我希望它刚好位于我装饰的控件上方。 这是装饰创建(问题不在于此代码): public void AddLabelDecoration() {
我正在使用 WPF 在绘图程序中为线条制作装饰器。这条线是在代码隐藏中绘制的,然后用我名为 LineAdorner 的自定义 Adorner 进行装饰。我设法使用 Thumb 作为直线的起点和终点。我
如果在WPF中一个装饰元素是使用抽象类Adorner实现的,那么在Avalonia UI中如何实现这个对象呢? //code wpf public class ControlAdorn
我需要根据 View 模型的属性显示(或不显示)装饰器。 我的看法是这样的:
原始问题:是否有 Adorner在 WPF 中自动继承其“AdornedElement”的“DataContext”? 最佳答案 这证明(或可以证明)它没有: public class SomeObj
我正在使用一个使用大量拖放操作的 WPF 应用程序。一切正常,除了 ListBoxItems。我有一个带有 ListBoxItems 的 ListBox,可以将其拖到另一个目标(StackPanel)
我正在为 Win 8 开发类似绘画的应用程序。我正在使用 this WPF 应用作为引用。 它使用 AdornerDecorator 和 Thumb 类来移动和调整组件大小;这些在 WinRT 中可用
如何在调试时删除带有 3 个图标的框? 最佳答案 只需取消选中 工具 -> 选项 -> 调试 -> 常规 -> 为 XAML 启用 UI 调试工具 -> 在应用程序中显示运行时工具。 关于c# - 调
我正在使用装饰器在文本框中显示水印。但是当我将窗口的 FlowDirection 设置为 RightToLeft 时,装饰器内的文本(即文本 block )是相反的!!! 这是一个错误还是我应该改
我是一名优秀的程序员,十分优秀!