类内部函数级别的strategy模式

使用代理来模拟多态

今天在写一个把图片处理成HTML文本显示的时候,在两层的循环嵌套内逐个处理像素。
循环内部处理像素的时候有多种选择。(比如处理成彩色的还是处理成黑白的和其他多种算法。)
如果在这里进行判断的话需要上十万次的相同的与非判断。(彩色的都要判断为真,黑白的相反)
虽说影响不是太大,但是本着写程序的时候需要考虑去掉任何可能影响程序性能的非必须操作。

受设计模式的影响,考虑如果实现成类的话最可能选择的就是strategy模式了。
这里一个简单操作。所以考虑使用代理来模拟类的多态。

下面是代码的部分内容

//定义代理原型 1
delegate int  GetColorInfoValue(Color color);
//声明代理 2
GetColorInfoValue gc = null;

//算法一 生成彩色 3
 private int GetColorValue(Color color)
    
{
        
int newColor;
        newColor 
= ((int)color.R) << 16;
        newColor 
+= ((int)color.G) << 8;
        newColor 
+= (int)color.B;
        
return newColor;
    }

//算法二  生成黑白 4
private int GetGryValue(Color color) 
    
{
        
int newColor;
        
int c = ((int)color.R * 30 + (int)color.R * 59 + (int)color.R * 11/ 100;
        newColor 
= c << 16;
        newColor 
+= c << 8;
        newColor 
+= c;
        
return newColor;
    }


//进行判断绑定不同的算法 5
 if (bColorType) { gc = new GetColorInfoValue(GetColorValue); } else { gc = new GetColorInfoValue(GetGryValue); }

//程序内部的调用 6
for (int i = 0; i < bmp.Height; i += 2)
        
{
            
for (int j = 0; j < bmp.Width; j += 2)
            
{
                color 
= bmp.GetPixel(j, i);
                sb.AppendFormat(
"<Font Color = \"#{0:X6}\">{1:s}</Font>", gc.Invoke(color), "0");//进行调用 7
            }

            sb.AppendLine();
            sb.AppendLine(
"<br/>");
        }

深入挖掘一下代理的应用场景,初学的时候以为代理就是跟事件一起用的。(汗!)


题外话
另外需要考虑文本的压缩问题。
1。灰度图片的压缩存在大量的 <font color="#5c5c5c">0</font>
处理办法 生成<font color="#5c">0</font>到客户端使用javascript和正则进行替换。
2。隔行隔列取一个出来
3。生成style 定义相同颜色的字符。
4。查找出相邻的颜色相同的字符放到一对标签内。
原文地址:https://www.cnblogs.com/sky266/p/940521.html