类内部函数级别的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。查找出相邻的颜色相同的字符放到一对标签内。

posted on 2007-10-28 17:54 暗香浮动 阅读(98) 评论(0)  编辑 收藏 所属分类: .net


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-10 21:13 编辑过
 
另存  打印
 


导航

公告

精致生活 7-24 15:10
<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

与我联系

常用链接

留言簿(2)

我管理的小组

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

舎友

搜索

最新评论

阅读排行榜

评论排行榜