Maison > Questions et réponses > le corps du texte
伊谢尔伦2017-04-18 10:47:59
L'endroit le plus couramment utilisé est d'implémenter la méthode modèle (Template Method) ?
Par exemple, vous souhaitez écrire un lot de proxys locaux pour les services distants. Pour ce lot d'agents, les étapes d'obtention de l'adresse de la demande, d'envoi de la demande et d'obtention du contenu correspondant sont toutes communes. Seules les deux étapes de définition du type de codage de caractères et de définition du rappel de réponse sont différentes.
À ce stade, vous pouvez définir une classe abstraite et terminer le processus de demande. Les différences sont laissées à la définition des sous-classes réelles. Ce n'est pas que le concepteur [ne permet pas] à la classe abstraite d'être instanciée, mais que certains attributs ne peuvent pas être déterminés avant de connaître les caractéristiques du service distant, rendant l'instanciation impossible.
L'exemple dans JDK est java.io.InputStream. Sa méthode read(byte[], int, int) appelle la méthode java.io.InputStream.read(). Read() est une méthode abstraite et doit être définie dans une sous-classe. Vous pouvez apprendre du code source.
public abstract int read() throws IOException;
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}
伊谢尔伦2017-04-18 10:47:59
Vous devez voir s'il hérite de classes ou implémente des interfaces
Très probablement, certaines méthodes partagées sont placées
Sinon, pourquoi ne pas le changer en interface
ringa_lee2017-04-18 10:47:59
Certaines méthodes publiques et champs d'instance peuvent avoir été extraits.
迷茫2017-04-18 10:47:59
Ce n'est pas que les classes abstraites sans méthodes abstraites ont une signification particulière. C'est juste la signification ordinaire des classes abstraites, étant donné une implémentation par défaut, cela peut nécessiter moins de code que l'implémentation directe de l'interface. D’un autre côté, quel est l’intérêt d’exiger qu’une classe abstraite conserve une ou deux méthodes abstraites ?
天蓬老师2017-04-18 10:47:59
Au contraire, afin que les sous-classes de cette classe créent certaines méthodes . Bien sûr, c'est aussi une exigence de l'interface, mais l'interface exige que toutes les méthodes soient des méthodes abstraites. Mais les classes abstraites peuvent prédéfinir certaines méthodes qui n'ont pas besoin d'être remplacées par des sous-classes.
Les classes abstraites et les interfaces sont toutes destinées à l'abstraction. Je ne parlerai pas des avantages de l'abstraction. Par exemple, si nous voulons implémenter une interface ou une classe Equal
, nous définissons deux méthodes equal
et unequal
. Si elle est implémentée à l’aide d’une interface, une classe doit implémenter ces deux méthodes. Cependant, s'il est implémenté avec une classe abstraite, unequal
peut être implémenté comme !equal
dans la classe abstraite, de sorte que unequal
doit être implémenté dans sa sous-classe.
Personnellement, je préfère les classes abstraites (mais Java
ne prend pas en charge l'héritage multiple). Par exemple, l'interface Compareable
a en fait une exigence, si a<b && b < c
alors a < c
, il n'y a aucune garantie dans l'interface que cela soit correct. Bien sûr, les classes abstraites ne peuvent pas résoudre le problème, mais pour ce qui précède Equal
, l'implémentation de classes abstraites est plus conforme aux exigences supplémentaires.
PHP中文网2017-04-18 10:47:59
Exemple :
Basé sur : spring mvc
public abstract class BaseController {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
@ModelAttribute
public void setReqAndResp(HttpServletRequest request, HttpServletResponse response){
this.request = request;
this.response = response;
this.session = request.getSession();
}
protected Map<String,String> getLoginUser(){
Object loginUser = request.getAttribute(Config.LOGIN_USER);
Map<String,String> loginUserMap = new HashMap<>();
loginUserMap.put(Config.USER_CODE,loginUser==null?"":loginUser.toString());
return loginUserMap;
//return (User) session.getAttribute(Constants.LOGIN_USER);
}
}
Session de réponse aux demandes d'attributs globaux communs
Méthode commune getLoginUser()
Bien sûr, il y en aura d'autres (quelques attributs et méthodes communs).
Comme il existe un contrôleur, le service dao peut également être utilisé.
J'extrais généralement du code de réinitialisation dans la classe parent pour l'utiliser.