首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

心得技巧分享-ASP.NET和Ajax应用一个超级实用的设计模式-享元工厂模式(泛型实现,模式名字不重要,关键是有用!)

2011-12-26 
经验技巧分享--ASP.NET和Ajax应用一个超级实用的设计模式---享元工厂模式(泛型实现,模式名字不重要,关键是

经验技巧分享--ASP.NET和Ajax应用一个超级实用的设计模式---享元工厂模式(泛型实现,模式名字不重要,关键是有用!)
超级大笨狼:经验技巧分享--ASP.NET和Ajax应用一个超级实用的设计模式---享元模式(泛型实现,模式名字不重要,关键是有用!)

在Web开发中,你是否困惑某些设计模式没什么用途或者不知所云?偶有心得,兴奋之余,不想独吞,特发出来大家分享.

问题起源:

1,Session[ "变量名称 "]对于编程,使用起来不方便,如果Session里面需要存储的变量名称过多,敲字符比较麻烦,如果根据Session[ "userID "]去数据库里存取,损失性能.

2,对于站内即时短消息,聊天,下棋性质的的程序,需要知道私聊对方的一些属性,由于通信频繁,而有些数据又没有长期保存的必要,所以需要一个类似2个用户共有的Session变量,这个变量可以随   用户/私聊/棋局   消失

而消失.

3,Ajax应用需要频繁的访问一些常用的对象变量,这些变量状态最好不要频繁从数据库读取,比如下棋的双方要知道对方是谁,颜色,走棋/聊天的变化等等,即是对方个人的东西,又是我方需要知道的内容,这些状态一经

创建,就要保留到用户离线为止.

4,相对精确判断离线的问题.

问题设想:
能不能创建一个类来实现一种Session一样的东东,对一个用户来说即可以单件模式创建,又可以指定的2个/几个用户在生存期共享?

可以用静态类的静态方法保证单件模式.返回一个实例来代替Session.这个办法类似设计模式里所说的享元模式或者某种工厂模式,叫他什么名字其实不重要,关键它很实用
.Net2.0以后提供了泛型,让实现这种模式更加方便,以下是精简的代码.

一,实体类:
        public   class   User
        {
                public   User(string   userId)
                {                  
                }
                public   string   color;
                public   string   userId;
                public   string   userName;
                public   string   enmyUserName;
                public   string   enmyUserId;
                public   string   enmyColor;
        }
二.管理实体类的类,叫它静态工厂也可以,用Dictionary来管理构造参数和返回的类,保证第一次创建后以后不重复创建.
public   static   class   UserManager
        {
                public   static   Dictionary <string,   User>   Users   =   new   Dictionary <string,   User> ();
                public   static   User   getUser(string   UserId)
                {
                        if   (Users.ContainsKey(UserId))
                        {
                                return   (Users[UserId]);
                        }
                        else
                        {
                                Users.Add(UserId,   new   User(UserId));
                        }
                        return   (Users[UserId]);
                }
        }

三,使用办法:
得到一个User的实例.
string   userId   =   Session[ "userId "].ToString();
User   U   =   UserManager.getUser(userId);



这样你在全站访问User的时候,相当于在Session里访问,
U.userName相当于在Session[ "userName "]   ,U.color相当于在Session[ "color "]   等等,编程方便许多,只用到了一个Session[ "userId "],其他都顺腾摸瓜出来了。

下面我们观察一下棋局/私聊的例子,是模拟两个用户共同创建的Session替代品
一,实体棋局类:
    public   class   board
        {
                public   board(string   redUserId,   string   grayUserId)
                {
                        //构造函数,参数是两个用户Id.
                }
}
  二.管理实体类的类,保证两个人不重复创建了唯一的一个棋局/私聊
public   static   class   boardManager
        {
                public   static   Dictionary <string,   board>   Boards   =   new   Dictionary <string,board> ();
                public   static   board   getBoard(string   redUserId,   string   grayUserId)
                {
                        string   Key   =   (Convert.ToInt32(redUserId)   >   Convert.ToInt32(grayUserId))   ?   (redUserId   +   "_ "   +   grayUserId)   :   (grayUserId   +   "_ "   +   redUserId);                        
                        if   (Boards.ContainsKey(Key)   )
                        {
                                return   (Boards[Key]);
                        }
                        else
                        {
                                Boards.Add(Key,   new   board(redUserId,   grayUserId));
                        }                        
                        return   (Boards[Key]);
                }
        }
  三,使用办法:    
  board   B   =   boardManager.getBoard(U.userId,   U.enmyUserId);

然后你想得到这个B的什么属性方法都可以,而且你可以得到或者设置当前棋局的每个用户的状态,这些状态可以在下棋/私聊结束的时候控制销毁掉。

我还用这个办法结合Ajax相对精确的判断对方离线。具体做法:你猜?不难实现。

总结:

静态类/静态方法,在web开发里可以用来代替Session和Application全局变量,对于提高性能和编程方便大有好处。
让类的实例有合理的生存周期,是web开发面向对象的难点,多考虑静态和类实例的结合,对web开发极其有益。

[解决办法]
学习~
[解决办法]
学习
[解决办法]
只能路过帮顶了……
------解决方案--------------------


mark!!
[解决办法]
好。
学习一下。
[解决办法]
顶下
[解决办法]
学习
[解决办法]
顶下
[解决办法]
待我方实践再评价,,,,,,,敬仰楼主的钻研精神
[解决办法]
顶下~~~
[解决办法]
关注下,学习学习~~~
[解决办法]
支持一下!
[解决办法]
静态类/静态方法,在web开发里可以用来代替Session和Application全局变量,对于提高性能和编程方便大有好处。

事实上在Web开发中,应注意避免直接访问Session、Application等公共容器,且索引名称应不吝啬的加上足够长的前缀,例如UserManageSystem_AccountInfomation。

长名字短名字在索引效率上没有差别,却能够有效的避免名称冲突。而为公共容器定义访问器,则能更进一步的避免名称冲突以及保证向下兼容。
[解决办法]
嗯,是补充一点。
[解决办法]
up
[解决办法]
up
[解决办法]
up
[解决办法]
那就mark下
[解决办法]
老狼不是搞ASP吗?哪时候开始弄ASP.NET了?
[解决办法]
学习学习~~~
[解决办法]
mark
[解决办法]
学习
[解决办法]
学习
[解决办法]
如果做一个私聊室,不知道适合吗
[解决办法]
有想法!想法不错。
[解决办法]
学习!!
[解决办法]
说道底就是cach
这样实现比较简单
其实用Elib的cache block块来实现会好得多
[解决办法]
学习!!
[解决办法]
学习
[解决办法]
学习
[解决办法]
up
[解决办法]
up
[解决办法]
学习
[解决办法]
up
[解决办法]
学习,很少使用静态变量的说
[解决办法]
学习了.UP下
------解决方案--------------------


mark
[解决办法]
学习
[解决办法]
学习了,顶了
[解决办法]
学习
[解决办法]
问一下楼主。。。

要跨页使用的话。。可以吗?

表笑话。。比较笨我。。
[解决办法]
学习
[解决办法]
mark
[解决办法]
路过...
[解决办法]
学习


接分
[解决办法]
学习
[解决办法]
不错
[解决办法]
很好,学到东西了,谢谢!
[解决办法]
同ls
[解决办法]
不错
[解决办法]
谢谢分享, 已复制下来保存到.TXT, 谢谢
[解决办法]
学习!!
[解决办法]
多谢楼主分享经验,Up!
[解决办法]
mark XUEXI
[解决办法]
希望楼主以后多发些这样的帖子让我们学习^_^
[解决办法]
mark it
[解决办法]
learn it
[解决办法]
其实就是sigleton设计模式.
[解决办法]
mark
[解决办法]
学习
[解决办法]
学习!楼主厉害
[解决办法]

[解决办法]
Session save的东西太多,是否考虑到服务器负载
[解决办法]
学习
[解决办法]
学习
[解决办法]
update
[解决办法]
mark

[解决办法]
学习
[解决办法]
慢慢看
[解决办法]
学习
[解决办法]
good
------解决方案--------------------


学习。
[解决办法]
mark~
[解决办法]
mark
[解决办法]

[解决办法]
不明白,以后学习中...
[解决办法]
不错,综合了很多知识,可以称得上是自己的模式了
申请一个专利吧
[解决办法]
太深奥了,看不懂……
[解决办法]
看不明白,只是把ID的值传进去了出来的却有很多信息,什么NAME 啊,color啊,都出来了,有那么神奇吗?感觉不符合质量守恒定律啊,那位大虾解释下
[解决办法]
学习
[解决办法]
mark
[解决办法]
mark........
[解决办法]
不明白,先顶起来,顶到我明白
[解决办法]



mark

[解决办法]
带猩猩还有楼主都去哪了?解释下我的疑问啊
[解决办法]
关注
[解决办法]
学习,理解,实践
[解决办法]
up
[解决办法]
TO:libany(紫心灯)
看清楚他放进去的是什么东西,之后你就不会有这个疑问了
[解决办法]
笨狼兄,这个东西比较好用
呵呵
我原来用ASP做一个购物车的时候,就是使用这个方法的
用字典来处理的,效果不错
现在你总结了一下,感觉比我那深入许多,佩服狼兄的才能....
[解决办法]
其实就相当与是将一个实体类的对象赋值给了session.因为在User定义了那些color,userId,userName这些属性,所以在通过UserManager.getUser(userId);这样返回了一个User对象,所以之后就可以通过访问这个User对象里的color,userId这些属性
[解决办法]
mark
[解决办法]
mark
[解决办法]
100占了~~~

热点排行