面向对象编程实现问题

3
该项目的理念是HTML渲染器。 但我想通过使用策略设计模式(不确定是否为策略模式:D)使其更加动态。 RenderStrategy:
public abstract class RenderStrategy
{
    private Element _RenderElement;
    public RenderStrategy(Element renderElement)
    {
        this._RenderElement = renderElement;
    }
    public abstract String Render();
}

元素:

public abstract class Element
{

    public String Render(RenderStrategy strategy)
    {
        return strategy.Render();
    }
}

enter image description here

我的问题是,如果不需要RenderCompositeElementStrategy,CompositeElement应该长成什么样子?

1个回答

1
我会这样做:

我会这样做:

public interface IStrategy 
{
   string Render();
}

public class Element : IStrategy
{
   public string Render() {
     return "rendering for element";
   }
}

public class CompositeElement : IStrategy
{
   public string Render() {
     return "rendering for composite element";
   }
}
public class HTMLRenderer
{
   private ISTrategy ele = new Element();
   private IStrategy comp = new CompositeElement();
   private IStrategy curr;
   public HTMLREnderer(){
     curr = ele; //i set default here to Element, but you can change it base on your need
   }
   public void RenderNow(){
     Console.WriteLine(curr.Render());
     //change your strategy accordingly to your need here, may be?
   }
}

不,我想这样使用它: 我有一个名为CompositeElement的div和一个名为Element的image。 我想要能够这样说: div.Render(new RenderHtml(div)); 或者 div.Render(new RenderText(div)); - Alexander Genov
图像渲染是什么意思? - ngunha02
<img src="图片链接" alt="替代信息"/> - Alexander Genov
问题在于复合元素有子节点。 元素没有子节点, 例如,要呈现div,您必须调用其所有子项的Render函数,将其保存到字符串中,如果呈现html,则需要将该字符串放在由div的Render函数生成的字符串的中间。问题是如何聪明地做到这一点,而不创建重复的类。 - Alexander Genov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接