设计模式
设计模式(Design Pattern)是一套被反复验证的可复用解决方案,用于解决在软件设计中常见的问题。
简单来说,设计模式是一种写代码的套路 。
设计模式不是具体的代码,而是告诉你在某种情况下该用什么结构来组织代码,使系统更灵活、更易维护。
设计模式的本质
想象一下建筑行业中的蓝图:建筑师不会每次都从零开始设计房屋,而是会参考经过验证的建筑模式。同样,在软件开发中,设计模式为我们提供了经过验证的"软件蓝图",帮助我们避免重复发明轮子。
为什么需要设计模式
1. 可维护性更高
设计模式能让代码更易修改。
当需求变化时,只需改动特定模块,而不是全局大改。
2. 可复用性强
抽象化设计让你能在多个项目中复用同样的结构。
3. 团队协作语言
"用装饰器模式实现这个功能"——团队成员一听就懂意图,节省沟通成本。
4. 提升架构思维
学习设计模式不是背代码,而是学会如何抽象问题、如何设计扩展点。
设计模式的分类
设计模式通常分为三大类,每类解决不同层面的设计问题:
创建型模式
这类模式关注对象的创建机制,让对象创建更加灵活和符合需求。
主要模式包括:
单例模式:确保一个类只有一个实例
工厂模式:提供创建对象的接口,让子类决定实例化哪个类
建造者模式:将复杂对象的构建与其表示分离
结构型模式
这类模式关注类和对象的组合方式,形成更大的结构。
主要模式包括:
适配器模式:使不兼容的接口能够协同工作
装饰器模式:动态地为对象添加新功能
代理模式:为其他对象提供一种代理以控制对这个对象的访问
行为型模式
这类模式关注对象之间的职责分配和通信方式。
主要模式包括:
观察者模式:定义对象间的一对多依赖关系
策略模式:定义一系列算法,使它们可以相互替换
命令模式:将请求封装为对象
常用设计模式应用场景
让我们通过一个表格来快速了解几个常用设计模式的应用场景:
设计模式
解决的问题
典型应用场景
单例模式
确保全局唯一实例
数据库连接、配置管理、日志系统
工厂模式
对象创建逻辑复杂
根据不同条件创建不同类型对象
观察者模式
对象间动态通知
事件处理系统、消息订阅
装饰器模式
动态扩展功能
IO流处理、中间件链
');
var statusdiv=$('#comment-status');
commentform.submit(function(e){
e.preventDefault();
var noteContent = editor.getValue();
// console.log(noteContent);
noteContent = noteContent.replace(/
/g,"");
noteContent = noteContent.replace(//g," ");
// 系列化表单数据
var comment_parent = 0;
var is_user_logged_in = $("#is_user_logged_in").val();
var comment_post_ID = 28814;
var _wp_unfiltered_html_comment = $("#_wp_unfiltered_html_comment").val();
var comment = noteContent;
var author = $("#author").val();
var url = $("#url").val();
var email = $("#email").val();
if(isBlank(author) && is_user_logged_in==0) {
statusdiv.html('请输入昵称!
').show();
} else if(isBlank(email) && is_user_logged_in==0) {
statusdiv.html('请输入邮箱!
').show();
} else {
// var formdata=commentform.serialize() + "&comment=" + noteContent ;
// 添加状态信息
statusdiv.html('Processing...
').show();
// 获取表单提交地址
var formurl=commentform.attr('action');
// 异步提交
$.ajax({
type: 'post',
url: formurl,
dataType:'json',
data: {"comment_parent":comment_parent,"comment_post_ID":comment_post_ID, "_wp_unfiltered_html_comment":_wp_unfiltered_html_comment,"comment":comment,"url":url, "email":email,"author":author},
error: function(XMLHttpRequest, textStatus, errorThrown){
statusdiv.html('数据不完整或表单提交太快了!
').show();
},
success: function(data, textStatus){
if(data.errorno=="0") {
$("#submit").prop('disabled', true);
statusdiv.html('笔记已提交审核,感谢分享笔记!
').show();
alert('笔记已提交审核,感谢分享笔记!');
}else{
statusdiv.html(''+data.msg+'
').show();
}
commentform.find('textarea[name=comment]').val('');
}
});
setTimeout(function(){
$("#submit").prop('disabled', false);
}, 10*1000);
}
return false;
});
$(".comt-author").click(function() {
href = $(this).children("a").attr("href");
if(href.indexOf("/note/")!=-1) {
var win = window.open(href, '_blank');
win.focus();
}
});
$(".comt-meta span").hover(function(){
$(this).children(".tooltip").css({ "opacity": 1, "pointer-events": "auto"});
},function(){
$(this).children(".tooltip").removeAttr("style");
});
/*
$(".wrapper i").hover(function(){
$(this).siblings(".tooltip").css({ "opacity": 1, "pointer-events": "auto"});
},function(){
$(this).siblings(".tooltip").css({ "opacity": 0, "pointer-events": "auto"});
});
*/
//Upvote.create('runoobvote-id', {callback: vote_callback});
var ajaxurl = 'https://www.runoob.com/wp-admin/admin-ajax.php';
var callback = function(data) {
//console.log($('#runoobvote-id').upvote('upvoted'));
//console.log($('#runoobvote-id').upvote('downvoted'));
//console.log(data);
_vote_action = data.action;
id_arr = data.id.split('-');
um_id= id_arr[2];
//console.log(um_id);
var re = /^[1-9]+/;
if (re.test(um_id)) {
var ajax_data = {
_vote_action: _vote_action,
action: "pinglun_zan",
um_id: um_id,
um_action: "ding"
};
//console.log(ajax_data);
$.post(ajaxurl,ajax_data,function(status){
//if(status.vote_num>999) {
// _voteHtml = ''+kFormatter(status.vote_num) +' ';
// $("#runoobvote-id-" + um_id + " .count").hide().after(_voteHtml);
//}
});
}
};
if($('#comments').length && $('.upvotejs').length){
$('.upvotejs').upvote({id: 28814, callback: callback});
$.post(ajaxurl,{"action":"pinglun_zan","postid":28814},function(data){
$(data).each(function(key,value) {
$("#runoobvote-id-" + value.commid + " .upvote").addClass(value.upvotejs_class);
$("#runoobvote-id-" + value.commid + " .downvote").addClass(value.downvote_class);
$("#runoobvote-id-" + value.commid + " .count").text(value.upvote_count);
})
},'json');
}
});
function isBlank(str) {
return (!str || /^\s*$/.test(str));
}
function kFormatter(num) {
// return num;
return Math.abs(num) > 999 ? Math.sign(num)*((Math.abs(num)/1000).toFixed(1)) + 'k' : Math.sign(num)*Math.abs(num)
}
点我分享笔记